Sql server 使用数据透视将日期转换为MTD、QTD、YTD
我有一张像下面这样的桌子Sql server 使用数据透视将日期转换为MTD、QTD、YTD,sql-server,pivot,unpivot,Sql Server,Pivot,Unpivot,我有一张像下面这样的桌子 Dates Start Date End Code Type Values Jan-14 Dec-14 AccountCode A1 0.005 Oct-14 Dec-14 AccountCode A1 0.001 Dec-14 Dec-14 AccountCode A1 0.0017 Jan-14 Dec-14 AccountCode A2 -0.004832912 Oct-14
Dates Start Date End Code Type Values
Jan-14 Dec-14 AccountCode A1 0.005
Oct-14 Dec-14 AccountCode A1 0.001
Dec-14 Dec-14 AccountCode A1 0.0017
Jan-14 Dec-14 AccountCode A2 -0.004832912
Oct-14 Dec-14 AccountCode A2 -0.002195574
Dec-14 Dec-14 AccountCode A2 -0.001396166
需要编写一个查询,我可以使用pivot将其转换为
displayperiod A1 A2
YTD 0.005 -0.004832912
QTD 0.001 -0.002195574
MTD 0.0017 -0.001396166
我目前正忙于将日期转换为YTD、MTD和QTD
非常感谢您的帮助
********************添加更多数据项
1月份数据
SELECT * FROM mytable
WHERE
AND data_enddate = '20140131'
ORDER BY type, data_startdate
Output from table
data_startdate data_enddate factor_name value
1/1/2014 1/31/2014 A1 0.0018
1/1/2014 1/31/2014 A2 0.0024
In this case MTD = YTD = QTD
hence the output required
displayperiod A1 A2
YTD 0.0018 0.002
QTD 0.0018 0.002
MTD 0.0018 0.002
二月数据
SELECT * FROM mytable
WHERE
AND data_enddate = '20140228'
ORDER BY type, data_startdate
Output from table
data_startdate data_enddate factor_name value
1/1/2014 2014-02-28 A1 0.0011
1/2/2014 2014-02-28 A1 0.0024
1/1/2014 2014-02-28 A2 0.0021
1/2/2014 2014-02-28 A2 0.0034
In this case MTD = QTD ,YTD
hence the output required
displayperiod A1 A2
YTD 0.0024 0.0034
QTD 0.0011 0.0021
MTD 0.0011 0.0021
三月数据
SELECT * FROM mytable
WHERE
AND data_enddate = '20140331'
ORDER BY type, data_startdate
Output from table
data_startdate data_enddate factor_name value
1/1/2014 2014-03-31 A1 0.0011
1/3/2014 2014-03-31 A1 0.0024
1/1/2014 2014-02-28 A2 0.0021
1/2/2014 2014-02-28 A2 0.0034
在这种情况下,MTD,QTD=YTD
hence the output required
displayperiod A1 A2
YTD 0.0011 0.0021
QTD 0.0011 0.0021
MTD 0.0024 0.0034
四月数据
SELECT * FROM mytable
WHERE
AND data_enddate = '2014-04-30'
ORDER BY type, data_startdate
Output from table
data_startdate data_enddate factor_name value
1/1/2014 2014-04-30 A1 0.0011
1/4/2014 2014-04-30 A1 0.0024
1/1/2014 2014-04-30 A2 0.0021
1/4/2014 2014-04-30 A2 0.0034
In this case MTD , QTD=YTD
hence the output required
displayperiod A1 A2
YTD 0.0011 0.0021
QTD 0.0011 0.0021
MTD 0.0024 0.0034
五月数据
SELECT * FROM mytable
WHERE
AND data_enddate = '2014-04-30'
ORDER BY type, data_startdate
Output from table
data_startdate data_enddate factor_name value
1/1/2014 2014-05-31 A1 0.0011
1/4/2014 2014-05-31 A1 0.0024
1/5/2014 2014-05-31 A1 0.0030
1/1/2014 2014-05-31 A2 0.0021
1/4/2014 2014-05-31 A2 0.0034
1/5/2014 2014-05-31 A2 0.0032
In this case MTD , QTD,YTD
hence the output required
displayperiod A1 A2
YTD 0.0011 0.0021
QTD 0.0024 0.0034
MTD 0.0030 0.0032
六月份数据
六月将有三排
七月份数据
七月将有两行,其中MTD=QTD和单独的YTD
八月数据
AUG将有两行,其中MTD=QTD和单独的YTD
9月份数据
9月将有3行
十月数据
Oct将有两行,其中MTD=QTD和单独的YTD
11月数据
Nov将有3行
12月数据
Dec将有3行在
透视
源查询中查找开始
和结束
日期之间的月
差异,以使用案例
语句获取显示期间
。试试这个
;WITH cte
AS (SELECT Cast('01-' + Dates_Start AS DATE) Date_Start,
Cast('01-' + Date_End AS DATE) Date_End,
code,type,value
FROM yourtable)
SELECT CASE
WHEN Datediff(mm, Date_Start, Date_End) + 1 = 12 THEN 'YTD'
WHEN Datediff(mm, Date_Start, Date_End) + 1 = 3 THEN 'QTD'
WHEN Datediff(mm, Date_Start, Date_End) + 1 = 1 THEN 'MTD'
END AS displayperiod,
[A1],
[A2]
FROM cte
PIVOT (Max(value)
FOR type IN ([A1],
[A2]))pv
答案就在这里
SELECT * INTO #temp FROM (
SELECT startdate ,
endate ,
factor_name,contribution
FROM myTable WHERE account_code = 'myaccount' and endate = '20140228' AND startdate IN ( SELECT
DATEADD(yy, DATEDIFF(yy,0,'20140228'), 0) AS StartOfYear)
UNION ALL
SELECT startdate ,
endate ,
factor_name,contribution
FROM myTable WHERE account_code = 'myaccount' and endate = '20140228' AND startdate IN (
SELECT
DATEADD(q, DATEDIFF(q, 0, '20140228'), 0) )
UNION ALL
SELECT startdate ,
endate ,
factor_name,contribution
FROM myTable WHERE account_code = 'myaccount' and endate = '20140228' AND startdate IN (SELECT DATEADD(mm, DATEDIFF(mm, 0, '20140228'), 0) )
) AS tmp
您的代码版本在哪里?感谢您的快速响应。我表格中的数据包含mtd、QTD和YTD,每个月的数据填充方式不同,例如:1月1日行so mtd=YTD=QTD二月2日行so mtd和QTD=YTD三月2日行so mtd和QTD=YTD四月2日行so mtd和QTD=YTD五月3日行so mtd,QTD,YTD六月3日行so mtd,QTD,年初至今7月2日第二行销售MTD和QTD=年初至今8月3日第三行销售MTD,QTD,年初至今9月3日第三行销售MTD,QTD,年初至今10月2日第二行销售MTD和QTD=年初至今11月3日第三行销售MTD,QTD,年初至今12月3日第三行销售MTD,QTD,YTD@user1143726-那么问题是什么?问题是,由于我共享的上述逻辑,表中的行数每个月都会不同。因此,我需要基于上述逻辑构建一个查询,以便获得YTD、MTD、,每次都是QTD。谢谢again@user1143726-可以添加一些样本数据,您的问题的预期输出不完全清楚我在原始问题中添加了样本数据。