需要統計數據生成簡易報表,由原表格數據是單行的形式,最好轉換爲列表格式,由網上介紹方法實現如下:
希望獲得的最終效果見下:
+-------+------+-------+-------+--------+--------+--------+---------------------+---------+
| 房間
+-------+------+-------+-------+--------+--------+--------+---------------------+---------+
| 0201
| 0204
| 0206
| 0302
| 0306
| 0308
| total | 1400 | 40.92 | 18.91 |
+-------+------+-------+-------+--------+--------+--------+---------------------+---------+
實現的SQL語句見下:
mysql>
源數據的表格式如下:
mysql> select RoomNo, CreateDate, FeeName, FeeMoney from Fee where bid=1;
+--------+---------------------+---------+----------+
| RoomNo | CreateDate
+--------+---------------------+---------+----------+
| 0101
| 0101
| 0101
| 0102
| 0102
| 0102
| 0102
| 0204
| 0204
| 0204
| 0204
| 0206
| 0206
| 0206
| 0206
| 0302
| 0302
| 0302
| 0302
| 0302
| 0302
| 0302
| 0302
| 0306
| 0306
| 0306
| 0306
| 0308
| 0308
| 0308
| 0308
+--------+---------------------+---------+----------+
31 rows in set (0.02 sec)
原文介紹地址 http://blogold.chinaunix.net/u3/90603/showart_2017912.html
數據樣本:
create table tx(
);
insert into tx values
(1 ,'A1','B1',9),
(2 ,'A2','B1',7),
(3 ,'A3','B1',4),
(4 ,'A4','B1',2),
(5 ,'A1','B2',2),
(6 ,'A2','B2',9),
(7 ,'A3','B2',8),
(8 ,'A4','B2',5),
(9 ,'A1','B3',1),
(10 ,'A2','B3',8),
(11 ,'A3','B3',8),
(12 ,'A4','B3',6),
(13 ,'A1','B4',8),
(14 ,'A2','B4',2),
(15 ,'A3','B4',6),
(16 ,'A4','B4',9),
(17 ,'A1','B4',3),
(18 ,'A2','B4',5),
(19 ,'A3','B4',2),
(20 ,'A4','B4',5);
mysql> select * from tx;
+----+------+------+------+
| id | c1
+----+------+------+------+
|
|
|
|
|
|
|
|
|
| 10 | A2
| 11 | A3
| 12 | A4
| 13 | A1
| 14 | A2
| 15 | A3
| 16 | A4
| 17 | A1
| 18 | A2
| 19 | A3
| 20 | A4
+----+------+------+------+
20 rows in set (0.00 sec)
mysql>
期望結果
+------+-----+-----+-----+-----+------+
|C1
+------+-----+-----+-----+-----+------+
|A1
|A2
|A3
|A4
|Total |22
+------+-----+-----+-----+-----+------+
1. 利用SUM(IF()) 生成列 + WITH ROLLUP 生成彙總行,並利用 IFNULL將彙總行標題顯示爲 Total
mysql> SELECT
+-------+------+------+------+------+-------+
| total | B1
+-------+------+------+------+------+-------+
| A1
| A2
| A3
| A4
| total |
+-------+------+------+------+------+-------+
5 rows in set, 1 warning (0.00 sec)
2. 利用SUM(IF()) 生成列 + UNION 生成彙總行,並利用 IFNULL將彙總行標題顯示爲 Total
mysql> select c1,
+-------+------+------+------+------+-------+
| c1
+-------+------+------+------+------+-------+
| A1
| A2
| A3
| A4
| TOTAL |
+-------+------+------+------+------+-------+
5 rows in set (0.00 sec)
mysql>
3.
mysql> select ifnull(c1,'total'),
+--------------------+------+------+------+------+-------+
| ifnull(c1,'total') | B1
+--------------------+------+------+------+------+-------+
| A1
| A2
| A3
| A4
| total
+--------------------+------+------+------+------+-------+
5 rows in set (0.00 sec)
mysql>
4. 動態,適用於列不確定情況,
mysql> SET @EE='';
mysql> SELECT @EE:=CONCAT(@EE,'SUM(IF(C2=\'',C2,'\'',',C3,0)) AS ',C2,',') FROM (SELECT DISTINCT C2 FROM TX) A;
mysql> SET @QQ=CONCAT('SELECT ifnull(c1,\'total\'),',LEFT(@EE,LENGTH(@EE)-1),' ,SUM(C3) AS TOTAL FROM TX GROUP BY C1 WITH ROLLUP');
Query OK, 0 rows affected (0.00 sec)
mysql> PREPARE stmt2 FROM @QQ;
Query OK, 0 rows affected (0.00 sec)
Statement prepared
mysql> EXECUTE stmt2;
+--------------------+------+------+------+------+-------+
| ifnull(c1,'total') | B1
+--------------------+------+------+------+------+-------+
| A1
| A2
| A3
| A4
| total
+--------------------+------+------+------+------+-------+
5 rows in set (0.00 sec)
mysql>
以上均由網友
其實數據庫中也可以用 CASE WHEN / DECODE