【问题标题】:SQL Pivot sum with specific condition具有特定条件的 SQL 数据透视总和
【发布时间】:2015-10-21 07:43:40
【问题描述】:

我正在尝试创建一个数据透视表,以便将特定月份作为总和,下面是我的表格和 sql 数据透视表:

CREATE TABLE yt
([Store] varchar(10), [Month] varchar(10), [xCount] int)
;

INSERT INTO yt
([Store], [Month], [xCount])
VALUES
('A', 'JAN', 1),
('A', 'FEB', 10),
('B', 'JAN', 2),
('B', 'FEB', 20),
('C', 'JAN', 3),
('C', 'FEB', 70),
('C', 'MAR', 110)    
;

    select *
    from 
    (
      select Store, Month, xCount
      from yt
    ) src
    pivot
    (
      sum(xcount)
      for Month in ([JAN], [FEB], [MAR])
    ) piv;

Store   JAN FEB MAR
A        1  10  NULL
B        2  20  NULL
C        3  70  110

以上结果我可以将当​​前月份的值相加。现在我想在 Store a 中对整个月求和,仅对 Store b 中的 FEB 和 MAR 求和,并在 Store c 中求和 MAR,所以我希望我的结果为

Store   JAN FEB MAR
A        6  100 110
B        5  90  110
C        3  70  110

我可以在枢轴上做吗?还是需要建表再次运行sql? 感谢您的帮助。

【问题讨论】:

    标签: sql-server sql-server-2008 pivot


    【解决方案1】:

    对于Sql Server 2008,您需要一些自加入和排序来计算总和。在这里,我按照这个顺序存储:

    WITH cte AS (SELECT * FROM @yt 
                 PIVOT(SUM(xcount) FOR Month IN ([JAN], [FEB], [MAR])) piv)
    SELECT  c1.Store ,
            SUM(c2.jan) AS jan ,
            SUM(c2.feb) AS feb ,
            SUM(c2.mar) AS mar
    FROM    cte c1
            JOIN cte c2 ON c1.Store <= c2.Store
    GROUP BY c1.Store
    

    【讨论】:

      【解决方案2】:

      您的问题是按商店 desc 运行总订单 在 SQL Server2005+ 中,你可以试试这个:

      SELECT Store,
          SUM([JAN]) OVER(ORDER BY Store DESC) AS [JAN],
          SUM([FEB]) OVER(ORDER BY Store DESC) AS [FEB],
          SUM([MAR]) OVER(ORDER BY Store DESC) AS [MAR]
      FROM (
      SELECT *
          FROM
          (
            SELECT Store, Month, xCount
            FROM yt
          ) src
          PIVOT
          (
            SUM(xcount)
            for Month in ([JAN], [FEB], [MAR])
          ) piv
      ) AS A
      ORDER BY Store
      

      但是在MySQL中,可以参考this link

      【讨论】:

      • 感谢您的回复,但我运行我的 sql 得到错误:Msg 102, Level 15, State 1, Line 2 'order' 附近的语法不正确。消息 156,级别 15,状态 1,第 17 行关键字“AS”附近的语法不正确。
      • 哦!我的代码使用 SQL 2005+(使用 Window 函数)
      • 哦,为什么你的标签是:sql-server?我的意思是,我在 SQL Server 中的代码 :)
      • 可以从sql server 2012获得带有order by的总和
      • 感谢您的帮助@NguyễnHảiTriều Hải Triều
      【解决方案3】:
      If you are using SQL SERVER 2012, you can use
      
      SELECT STORE,
             SUM(JAN)
               OVER (
                 ORDER BY RN DESC) JAN,
             SUM(FEB)
               OVER (
                 ORDER BY RN DESC) FEB,
             SUM(MAR)
               OVER (
                 ORDER BY RN DESC) MAR
      FROM  (SELECT ROW_NUMBER()
                      OVER (
                        ORDER BY STORE)RN,
                    *
             FROM   (SELECT STORE,
                            MONTH,
                            XCOUNT
                     FROM   #YT) SRC
                    PIVOT ( SUM(XCOUNT)
                          FOR MONTH IN ([JAN],
                                        [FEB],
                                        [MAR]) ) PIV)A 
      ORDER BY RN ASC
      

      【讨论】:

      • 感谢您的帮助,如果我在 2008 年运行将显示错误消息 102,级别 15,状态 1,第 5 行“订单”附近的语法错误。消息 102,级别 15,状态 1,第 23 行“A”附近的语法不正确。看来2008不支持over方法,我猜
      猜你喜欢
      • 1970-01-01
      • 2012-03-24
      • 1970-01-01
      • 2018-12-31
      • 1970-01-01
      • 1970-01-01
      • 2020-08-30
      • 1970-01-01
      • 2012-11-05
      相关资源
      最近更新 更多