iT邦幫忙

0

MS SQL指令可整合成1個SQL嗎?(12個月)

XYZ 2022-10-07 11:38:011524 瀏覽
  • 分享至 

  • xImage

大家好,

請教大家有個sql有12個月(01、02、03.....、10、11、12)要寫12個SQL指令, 有辦法改寫成1個SQL嗎?

select
no,
01 as 月,
SUM(CASE WHEN SUBSTRING([type_order], 1, 1) = 'a' THEN money01 ELSE 0 END) AS 月收入
from a
GROUP BY no

UNION
select
no,
02 as 月,
SUM(CASE WHEN SUBSTRING([type_order], 1, 1) = 'a' THEN money02 ELSE 0 END) AS 月收入
from a
GROUP BY no
.
.
.

UNION
select
no,
12 as 月,
SUM(CASE WHEN SUBSTRING([type_order], 1, 1) = 'a' THEN money12 ELSE 0 END) AS 月收入
from a
GROUP BY no

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
尼克
iT邦大師 1 級 ‧ 2022-10-07 11:44:30

Oracle Row to Column 函式介紹
這是你要的嗎?
還有你要用SQL Fiddle填寫資料,別人才會更快回覆你。

XYZ iT邦新手 4 級 ‧ 2022-10-07 12:06:06 檢舉

我要寫成MS SQL指令查資料,謝謝您

0
kw6732
iT邦研究生 5 級 ‧ 2022-10-07 13:11:49

用一句 MS SQL指令解決的方法如下,E_date 是日期欄位,@year 是 年(4位) @ym 是 年月(2+2位):

declare @year varchar(8) = '2022', @ym varchar(8) = 'ALL';

select no, FORMAT(E_date,'yyMM') 月, SUM(CASE WHEN SUBSTRING([type_order], 1, 1) = 'a' THEN money+FORMAT(E_date,'MM') ELSE 0 END) AS 月收入 from a WHERE FORMAT(E_date,'yyyy')=@year and ( @ym='ALL' OR FORMAT(E_date,'yyMM')=@ym ) GROUP BY no, FORMAT(E_date,'yyMM') ORDER BY no, FORMAT(E_date,'yyMM')
看更多先前的回應...收起先前的回應...
XYZ iT邦新手 4 級 ‧ 2022-10-07 14:07:07 檢舉

謝謝您的回覆
我的Table沒有日期欄位, 要怎麼改寫呢?

XYZ iT邦新手 4 級 ‧ 2022-10-07 14:14:57 檢舉

補充說明:

月要呈現01、02、03....10、11、12
下面的sum的money欄位也要隨之變為
money01、money02、money03、...money10、money11、money12

SUM(CASE WHEN SUBSTRING([type_order], 1, 1) = 'a' THEN money01 ELSE 0 END) AS 月收入

SUM(CASE WHEN SUBSTRING([type_order], 1, 1) = 'a' THEN money02 ELSE 0 END) AS 月收入

SUM(CASE WHEN SUBSTRING([type_order], 1, 1) = 'a' THEN money03 ELSE 0 END) AS 月收入

SUM(CASE WHEN SUBSTRING([type_order], 1, 1) = 'a' THEN money10 ELSE 0 END) AS 月收入

....

kw6732 iT邦研究生 5 級 ‧ 2022-10-07 15:57:47 檢舉

SUM(CASE WHEN SUBSTRING([type_order], 1, 1) = 'a' THEN money01 ELSE 0 END) AS 月收入

以上 SUBSTRING([typeorder], 1, 1) = 'a' 條件都相同 如何有不同月的資料出現 是放在不同欄位嗎?

XYZ iT邦新手 4 級 ‧ 2022-10-07 16:12:15 檢舉

a' 條件都相同

希望出現的資料如下:
https://ithelp.ithome.com.tw/upload/images/20221007/20108157BSluiDyppK.png

kw6732 iT邦研究生 5 級 ‧ 2022-10-07 16:43:07 檢舉

簡單說:
查詢的欄位中內一定要有辦法識別出 "當月" 不論格式是文字、日期、數字都可以執行轉換與查詢,才有辦法群組寫成一個式子,已你目前所提供的資料,無法解釋如何變成一個簡易的SQL查詢語句。

0
rogeryao
iT邦超人 8 級 ‧ 2022-10-07 15:10:09
CREATE TABLE MM (
TYPE_ORDER VARCHAR(10),
MONEY01 INT,
MONEY02 INT,
MONEY03 INT,
MONEY04 INT,
MONEY05 INT,
);

INSERT INTO MM VALUES
('A11',11,22,33,44,55),
('B22',22,33,44,55,66),
('A33',33,44,55,66,77),
('C44',44,55,66,77,88);
WITH CTE_01 AS (
SELECT TYPE_ORDER,QTY,MONEY FROM
(SELECT TYPE_ORDER,MONEY01,MONEY02,MONEY03,MONEY04,MONEY05 FROM MM) AS A
UNPIVOT(QTY FOR MONEY IN (MONEY01,MONEY02,MONEY03,MONEY04,MONEY05)) AS B
)
  
SELECT MONTH,SUM(QTY) AS QTY 
FROM 
(SELECT RIGHT(MONEY,2) AS 'MONTH',*
FROM CTE_01
WHERE LEFT(TYPE_ORDER,1) = 'A') AS C 
GROUP BY MONTH 

Demo

請參閱 :sql pivot(行轉列) 和unpivot(列轉行)的用法

0

我要發表回答

立即登入回答