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-可以添加一些样本数据,您的问题的预期输出不完全清楚我在原始问题中添加了样本数据。