sql行轉列方式


第一種常規方法,利用子查詢和集合計算:
select lineCode,
SUM(CASE tmp.alarmSubType WHEN '1' THEN tmp.count ELSE 0 END) '1',
SUM(CASE tmp.alarmSubType WHEN '2' THEN tmp.count ELSE 0 END) '2',
SUM(CASE tmp.alarmSubType WHEN '3' THEN tmp.count ELSE 0 END) '3',
SUM(CASE tmp.alarmSubType WHEN '4' THEN tmp.count ELSE 0 END) '4',
SUM(CASE tmp.alarmSubType WHEN '5' THEN tmp.count ELSE 0 END) '5',
SUM(CASE tmp.alarmSubType WHEN '6' THEN tmp.count ELSE 0 END) '6',
SUM(CASE tmp.alarmSubType WHEN '7' THEN tmp.count ELSE 0 END) '7',
SUM(CASE tmp.alarmSubType WHEN '8' THEN tmp.count ELSE 0 END) '8',
SUM(CASE tmp.alarmSubType WHEN '9' THEN tmp.count ELSE 0 END) '9',
SUM(CASE tmp.alarmSubType WHEN '10' THEN tmp.count ELSE 0 END) '10',
SUM(CASE tmp.alarmSubType WHEN '11' THEN tmp.count ELSE 0 END) '11',
SUM(CASE tmp.alarmSubType WHEN '12' THEN tmp.count ELSE 0 END) '12',
SUM(CASE tmp.alarmSubType WHEN '13' THEN tmp.count ELSE 0 END) '13',
SUM(CASE tmp.alarmSubType WHEN '14' THEN tmp.count ELSE 0 END) '14',
SUM(CASE tmp.alarmSubType WHEN '15' THEN tmp.count ELSE 0 END) '15'
from (
select busstainfo_xl as lineCode, count(*) count, busstainfo_pllx as alarmSubType
from busstainfo
where busstainfo_rq between '20220216' and '20220216'
and busstainfo_bjlx = '疲勞駕駛'
group by busstainfo_xl, busstainfo_pllx
) tmp
GROUP BY lineCode


第二種利用 PIVOT
with tmp as (
select busstainfo_xl as lineCode, count(*) count, busstainfo_pllx as alarmSubType
from busstainfo where busstainfo_rq between '20220216' and '20220216'
and busstainfo_bjlx = '疲勞駕駛'
group by busstainfo_xl, busstainfo_pllx)

SELECT * FROM tmp
PIVOT
(
SUM(count) for [alarmSubType] in ([1])
) TBL


抽時間再做詳細解釋。
有興趣參考這兩篇行專列文章:
SQL之行轉列Pivot函數 - 簡書 (jianshu.com)
MySQL行專列、多表聯查行專列、sql行專列_李程程的博客-CSDN博客_行專列

示例
SELECT B.date,B.天然氣,B.天然氣,B.柴油,B.電
from (
SELECT SUBSTRING(REPLACE(time, '-', ''), 0, 7) date,
type,
sum(amount) AS amount
FROM table
group by SUBSTRING(REPLACE(time, '-', ''), 0, 7), type
) A PIVOT (
SUM(A.amount) FOR [type] IN ([電], [LNG天然氣], [CNG天然氣],[柴油])
) B
 
 SELECT top 10
SUBSTRING(REPLACE(time, '-', ''), 0, 7) date,
case fill_type when '電' then isnull(sum(amount),0) end 'elec',
case fill_type when 'LNG天然氣' then isnull(sum(amount),0) end 'lng',
case fill_type when 'CNG天然氣' then isnull(sum(amount),0) end 'cng',
case fill_type when '柴油' then isnull(sum(amount),0) end 'diesel'
FROM table
where SUBSTRING(REPLACE(time, '-', ''), 0, 7) like '202%'
group by SUBSTRING(REPLACE(time, '-', ''), 0, 7), type order by date desc



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM