iT邦幫忙

1

sql的欄位問題

https://ithelp.ithome.com.tw/upload/images/20200318/20061726ZTgbtfawwU.png
我想請問一下各位前輩如上圖
我的欄位的名稱是 201909 201910 201911 201912 202001 202002 202003
四月份的時候希望可以自動的變成
201910 201911 201912 202001 202002 202003 202004
也就是說每換一個月 前面的就會被擠掉 最後面的變成了當月的日期

只要到月份就好了

我爬了許都文 都找不到相關的訊息,昨天搞了一天到現在還沒弄好
麻煩前輩救救我吧

SELECT          區域, 客戶名稱, 客戶代號, 價格條件, 備註, TOTAL
FROM              
(SELECT          C.MA015 AS 區域, C.MA002 AS 客戶名稱, C.MA001 AS 客戶代號, C.MA030 AS 價格條件,   C.MA049 AS 備註, SUM(A.TA041 + A.TA042 - A.TA044) AS TOTAL, LEFT(A.TA003, 6) AS Expr2
FROM  dbo.ACRTA AS A INNER JOIN  dbo.COPMA AS C ON A.TA004 = C.MA001
 WHERE   (C.MA001 NOT LIKE 'S%') AND (A.TA027 = 'N') AND (A.TA025 = 'Y') AND (A.TA001 IN ('611', '612', '613',  '615', '617', '620', '614')) AND (DATEDIFF(m, A.TA003, GETDATE()) = 1)
 GROUP BY    C.MA001, C.MA002, C.MA030, C.MA049, C.MA015, A.TA003, DATEDIFF(m, A.TA003, GETDATE())
 HAVING            (SUM(A.TA041 + A.TA042 - A.TA044) <> 0)) AS M

這是我SQL的語法 我只是先做其中的一個月,SUM(A.TA041 + A.TA042 - A.TA044) AS TOTAL但 TOTAL的欄位希望能是年月,請問我要怎麼做呢?

我試過了
DECLARE @M0 varchar(7)
SET @M0 = CONVERT(varchar(10),dateadd(month,-1,getdate()),111)
SET @M0 = left(@M0,7)
exec sp_rename 'M.TOTAL' , 'M0'

這幾行是我爬行試的
但是還是不行
麻煩一下各位先進前輩教教我
或者是用 ASP的gridview可以做的到也可以

石頭 iT邦研究生 2 級 ‧ 2020-03-18 10:35:18 檢舉
可以考慮使用
https://dotblogs.com.tw/daniel/2019/02/15/174535,
https://dotblogs.com.tw/daniel/2018/03/18/213231
dynamic pivot 動態樞紐分析 + CTE 遞迴
石頭 iT邦研究生 2 級 ‧ 2020-03-18 10:41:06 檢舉
可否提供貼近你目前資料表欄位和資料? 因為你只給目前查詢結果資料 我無法提供正確能幫助到你的語法
loveotgi iT邦新手 5 級 ‧ 2020-03-18 11:12:10 檢舉
資料表
ACRTA
COPMA
資料欄位
C.MA015 AS 區域, C.MA002 AS 客戶名稱, C.MA001 AS 客戶代號, C.MA030 AS 價格條件, C.MA049 AS 備註, SUM(A.TA041 + A.TA042 - A.TA044) AS TOTAL
資料
區域 客戶代號 簡稱 逾期 2019/10 2019/11 2019/12 2020/01 2020/02 總計
AA251 C105002 AAA 25000 25000
AA111 C105014 BBB 750 750
AA111 C106002 CCC 15000 15000
AA111 C110008 DDD 2600 2600
AA111 C110009 EEE 1050 1050
AA251 C111018 FFF 6500 6500
AA111 C114002 GGG 13000 8750 21750
AA111 C202001 HHH 5000 5000
AA252 C202006 JJJ 5000 5000
AA112 C220048 KKK 3600 3600 3600 10800
AA112 C220052 LLL 5200 5200
AA111 C221003 MMM 2600 2600
AA112 C235022 OOO 3600 3600
AA252 C242010 PPP 5000 5000
麻煩您了 謝謝

2 個回答

4
Barron
iT邦新手 5 級 ‧ 2020-03-18 09:52:00

我想你應該要把日期放到另一個 Table
然後關聯 Primary key
而不是修改欄位名稱

例如

https://ithelp.ithome.com.tw/upload/images/20200318/20125678LY6SgI8ow8.jpg

https://ithelp.ithome.com.tw/upload/images/20200318/20125678jKeSE1wnU4.jpg

loveotgi iT邦新手 5 級 ‧ 2020-03-18 11:13:44 檢舉

可是這樣日期會變直的,而且每一列都會出現,我是想要日期是橫的
然後會隨每個月而變化

loveotgi iT邦新手 5 級 ‧ 2020-03-18 11:14:17 檢舉

不過謝謝你 我似乎有想到一個方法 等等試試 試完再跟您說 謝謝

0
rogeryao
iT邦大師 5 級 ‧ 2020-03-18 13:38:05
SELECT MA015,TA004,MA002,
SUM(CASE WHEN YM=(CONVERT(VARCHAR(6),DATEADD(MONTH,-6,GETDATE()),112))
THEN TOTAL  ELSE 0 END) AS '201909',
SUM(CASE WHEN YM=(CONVERT(VARCHAR(6),DATEADD(MONTH,-5,GETDATE()),112))
THEN TOTAL  ELSE 0 END) AS '201910',
SUM(CASE WHEN YM=(CONVERT(VARCHAR(6),DATEADD(MONTH,-4,GETDATE()),112))
THEN TOTAL  ELSE 0 END) AS '201911',     
SUM(CASE WHEN YM=(CONVERT(VARCHAR(6),DATEADD(MONTH,-3,GETDATE()),112))
THEN TOTAL  ELSE 0 END) AS '201912',
SUM(CASE WHEN YM=(CONVERT(VARCHAR(6),DATEADD(MONTH,-2,GETDATE()),112))
THEN TOTAL  ELSE 0 END) AS '202001',
SUM(CASE WHEN YM=(CONVERT(VARCHAR(6),DATEADD(MONTH,-1,GETDATE()),112))
THEN TOTAL  ELSE 0 END) AS '202002',
SUM(CASE WHEN YM=(CONVERT(VARCHAR(6),DATEADD(MONTH,0,GETDATE()),112))
THEN TOTAL  ELSE 0 END) AS '202003'
FROM (
SELECT  TA004 ,SUBSTRING(TA003,1,6) AS 'YM',SUM(TA041+TA042-TA058) AS TOTAL
FROM ACRTA 
WHERE 1=1
AND TA003 >=CONVERT(VARCHAR(6),DATEADD(MONTH,-6,GETDATE()),112)+'01'
AND TA003 < CONVERT(VARCHAR(6),DATEADD(MONTH,+1,GETDATE()),112)+'01'
GROUP BY TA004,SUBSTRING(TA003,1,6)
) AS TEMP
LEFT JOIN COPMA ON MA001=TA004
GROUP BY TA004,MA015,MA002
ORDER BY TA004,MA015,MA002

AS '201909',AS '201910',......AS '202003' 自行修改

看更多先前的回應...收起先前的回應...
loveotgi iT邦新手 5 級 ‧ 2020-03-18 14:56:26 檢舉

謝謝您,可是這樣的寫法 我還是必須要每個月去改一次 年月
我是希望他可以自動在每月一號可以自己更新

rogeryao iT邦大師 5 級 ‧ 2020-03-18 15:08:19 檢舉

把上面的 SQL 改成 stored procedure , 傳參數就可以了

rogeryao iT邦大師 5 級 ‧ 2020-03-18 23:35:48 檢舉
CREATE PROCEDURE [dbo].[Test]
AS
BEGIN
SET NOCOUNT ON;

DECLARE @SQLCommandAll nvarchar(max)
DECLARE @YM01 nvarchar(max)
DECLARE @YM02 nvarchar(max)
DECLARE @YM03 nvarchar(max)
DECLARE @YM04 nvarchar(max)
DECLARE @YM05 nvarchar(max)
DECLARE @YM06 nvarchar(max)
DECLARE @YM07 nvarchar(max)

SET @YM01 =  (CONVERT(VARCHAR(6),DATEADD(MONTH,-6,GETDATE()),112))
SET @YM02 =  (CONVERT(VARCHAR(6),DATEADD(MONTH,-5,GETDATE()),112))
SET @YM03 =  (CONVERT(VARCHAR(6),DATEADD(MONTH,-4,GETDATE()),112))
SET @YM04 =  (CONVERT(VARCHAR(6),DATEADD(MONTH,-3,GETDATE()),112))
SET @YM05 =  (CONVERT(VARCHAR(6),DATEADD(MONTH,-2,GETDATE()),112))
SET @YM06 =  (CONVERT(VARCHAR(6),DATEADD(MONTH,-1,GETDATE()),112))
SET @YM07 =  (CONVERT(VARCHAR(6),DATEADD(MONTH,0,GETDATE()),112))
--
SET @SQLCommandAll = 'SELECT MA015,TA004,MA002,
SUM(CASE WHEN YM='+@YM01+'
THEN TOTAL  ELSE 0 END) AS '''+@YM01+''','+
'SUM(CASE WHEN YM='+@YM02+'
THEN TOTAL  ELSE 0 END) AS '''+@YM02+''','+
'SUM(CASE WHEN YM='+@YM03+'
THEN TOTAL  ELSE 0 END) AS '''+@YM03+''','+     
'SUM(CASE WHEN YM='+@YM04+'
THEN TOTAL  ELSE 0 END) AS '''+@YM04+''','+
'SUM(CASE WHEN YM='+@YM05+'
THEN TOTAL  ELSE 0 END) AS '''+@YM05+''','+
'SUM(CASE WHEN YM='+@YM06+'
THEN TOTAL  ELSE 0 END) AS '''+@YM06+''','+
'SUM(CASE WHEN YM='+@YM07+'
THEN TOTAL  ELSE 0 END) AS '''+@YM07+'''
FROM (
SELECT  TA004 ,SUBSTRING(TA003,1,6) AS ''YM'',SUM(TA041+TA042-TA058) AS TOTAL
FROM ACRTA 
WHERE 1=1
AND TA003 >=CONVERT(VARCHAR(6),DATEADD(MONTH,-6,GETDATE()),112)+''01''
AND TA003 <CONVERT(VARCHAR(6),DATEADD(MONTH,+1,GETDATE()),112)+''01''
GROUP BY TA004,SUBSTRING(TA003,1,6)
) AS TEMP
LEFT JOIN COPMA ON MA001=TA004
GROUP BY TA004,MA015,MA002
ORDER BY TA004,MA015,MA002'
--
EXEC sp_executesql @SQLCommandAll;
--PRINT @SQLCommandAll;
END

GO

每個月一號執行

EXEC [dbo].[Test]
loveotgi iT邦新手 5 級 ‧ 2020-03-19 08:26:37 檢舉

謝謝您

我要發表回答

立即登入回答