【问题标题】:t-sql pivot - monthly revenuet-sql pivot - 月收入
【发布时间】:2014-01-17 18:09:50
【问题描述】:

我无法弄清楚如何为我的收入查询构建PIVOT

首先,这是我的查询:

SELECT  DATENAME(month,
             CONVERT(DATETIME, CONVERT(VARCHAR, TransactionMonth) + '/1'
             + '/2013')) AS MONTH ,
    RevenueGroup ,
    AMOUNT
FROM    ( SELECT    f.TransactionMonth ,
                f.RevenueGroupID ,
                '$'
                + CONVERT(VARCHAR, CAST(SUM(f.LineItemAmount) AS MONEY), -1) AS Revenue ,
                MIN(f.RevenueGroup) AS RevenueGroup
      FROM      Financials(@StartDate, @EndDate, @SiteID) f
      GROUP BY  f.TransactionMonth ,
                f.RevenueGroupID
    ) AS Rev
ORDER BY Rev.TransactionMonth DESC ,
        CAST(Revenue AS MONEY) DESC

这是我的结果集:

MONTH       RevenueGroup         AMOUNT
December    Dues - Collect       $425,725.71
December    NMS                  $78,444.17
December    Personal Training    $58,511.53
November    Dues - Collect       $425,683.75
November    NMS                  $114,710.25
November    Personal Training    $66,277.49
October     Dues - Collect       $419,250.09
October     NMS                  $96,098.86
October     Personal Training    $58,725.77

以下是结果集需要如何处理 sql PIVOT:

RevenueGroup        DECEMBER      NOVEMBER      OCTOBER
Dues - Collect      $425,725.71   $425,683.75   $419,250.09
NMS                 $78,444.17    $114,710.25   $96,098.86
Personal Training   $58,511.53    $66,277.49    $58,725.77

如何使用 T-SQL PIVOT 实现这一点?

【问题讨论】:

    标签: sql-server tsql pivot


    【解决方案1】:

    测试数据

    CREATE TABLE #MyTable ([MONTH] NVARCHAR(20),RevenueGroup NVARCHAR(100),AMOUNT NUMERIC(20,2))
    GO
    INSERT INTO #MyTable
    VALUES
    ('December','Dues - Collect',       425725.71),
    ('December','NMS',                  78444.17),
    ('December','Personal Training',    58511.53),
    ('November','Dues - Collect',       425683.75),
    ('November','NMS',                  114710.25),
    ('November','Personal Training',    66277.49),
    ('October','Dues - Collect',       419250.09),
    ('October','NMS',                  96098.86),
    ('October','Personal Training',    58725.77)
    

    查询

    SELECT RevenueGroup, [October],[November],[December]
    FROM (SELECT * FROM #MyTable)t   --<-- Your Existing Query can go in here but do not
      PIVOT                             -- not do any formating like Dollar sign as you want
          (                             -- sum the results by month later on    
          SUM(AMOUNT)
          FOR [MONTH]
          IN ([October],[November],[December])
          )P
    

    结果

    ╔═══════════════════╦═══════════╦═══════════╦═══════════╗
    ║   RevenueGroup    ║  October  ║ November  ║ December  ║
    ╠═══════════════════╬═══════════╬═══════════╬═══════════╣
    ║ Dues - Collect    ║ 419250.09 ║ 425683.75 ║ 425725.71 ║
    ║ NMS               ║ 96098.86  ║ 114710.25 ║ 78444.17  ║
    ║ Personal Training ║ 58725.77  ║ 66277.49  ║ 58511.53  ║
    ╚═══════════════════╩═══════════╩═══════════╩═══════════╝
    

    【讨论】:

    • M.Ali,你太棒了!效果很好。还有一件事会让这个蛋糕锦上添花。月份必须是动态的。例如,由于这是 2013 年 12 月,我的月份列必须是 12 月、11 月、10 月(过去 3 个月)。几天后将是一月,然后我需要一月,十二月,十一月。我的原始查询处理动态月份没有问题,但我不确定如何使用枢轴。
    • 如果我要创建一个新问题,请告诉我。
    • @SweatCoder 不要担心新问题,只需在您的内部查询中添加 WHERE 子句,例如 MONTH(ColumnName) &gt;= MONTH(DATEADD(MONTH, -3, GETDATE()))
    • @SweatCoder 对于动态月份,您需要使用动态 sql 在数据透视表中构建 IN 子句
    • @M.Ali ... 只是一个挑剔的小细节。我认为您希望它在您的 DATEADD 中为 -2,因为 -3 将使您恢复三个月,并导致总共报告四个月。
    【解决方案2】:

    这已经有一个最佳答案,这并不是一个答案,而是关于如何为动态 SQL 捕获动态月份的附录提示...

    Declare @dynamicColumns Nvarchar(64)
    
    Select  @dynamicColumns = Coalesce(@dynamicColumns + ',','') + '[' + m.months + ']'
    From   (Select  0 As monthSubtract
            Union
            Select  1
            Union
            Select  2) As ms
    Cross   Apply (Select DateName(MONTH,DATEADD(MONTH, -ms.monthSubtract, GETDATE())) As months) m
    Order   By ms.monthSubtract Desc
    
    Select  @dynamicColumns
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-06
      • 1970-01-01
      • 2013-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-07
      相关资源
      最近更新 更多