今天遇到一种sql语句的情况,如下图,我的需求是根据gate_type(大门类型:出口和入口,分别去统计各个时间段的人数和),如果是分开去统计的只要根据group by就行,但是我需要他们显示成一条数据,
结果解决:
用交叉查询:case函数 语法:case when 条件 then XXX else null end
其中null可以换成0或者是其他你想默认的数据,意思就是XXX如果没查到就给定一个数
SELECT ground_name ,
SUM(CASE WHEN a.gate_type='入口' THEN (before_09+time_09_10+time_10_11+time_11_12+time_12_13+time_13_14+time_14_15+time_15_16+time_16_17+time_17_18+time_18_19+time_19_20+time_20_21+after_21) ELSE NULL END) AS "入口总人数",
SUM(CASE WHEN a.gate_type='出口' THEN (before_09+time_09_10+time_10_11+time_11_12+time_12_13+time_13_14+time_14_15+time_15_16+time_16_17+time_17_18+time_18_19+time_19_20+time_20_21+after_21) ELSE NULL END) AS "出口总人数"
FROM dwd_tour_ticket_stat_flow_d AS a
WHERE date_time='20190802'
GROUP BY ground_name;
参考其他的文章:https://blog.csdn.net/xingxing1839381/article/details/85328444
另外一种sql:
MySQL一个字段中逗号隔开的拆成多行
需要拆成
具体的sql: test_001是表名 typeid2是需要拆分的字段名,下面的sql最多支持拆成7个 需要增加数量 UNION ALL SELECT 7 以此类推
SELECT
id,
SUBSTRING_INDEX(SUBSTRING_INDEX(typeid2, ',', numbers.n), ',', -1) AS typeid
FROM
test_001
JOIN
(SELECT 1 n UNION ALL
SELECT 2 UNION ALL
SELECT 3 UNION ALL
SELECT 4 UNION ALL
SELECT 5 UNION ALL
SELECT 6 UNION ALL
SELECT 7) numbers
ON
CHAR_LENGTH(typeid2)
-CHAR_LENGTH(REPLACE(typeid2, ',', ''))>=numbers.n-1
ORDER BY id,typeid