【问题标题】:pivot in MS SQL query output以 MS SQL 查询输出为中心
【发布时间】:2016-09-06 07:20:36
【问题描述】:

我从这个查询中尝试这个查询,我得到多个同名记录的结果

    SELECT 
       S.Fruit
       ,S.RegNo
       ,SUM(total) total 
    FROM (SELECT  
              RV.Fruit
              ,RV.RegNo
              ,COUNT(vv.Fruit) as total
              , RV.MS 
          from vv inner join RV on vv.MID= RV.ID 
          inner join Re on RV.RID=Re.RID 
          WHERE Reg.SDate>='2016-04-0100:00:00.000' and 
                Reg.EDate<= '2016-04-30 23:59:59.000'  and 
                Reg.Reg= 'UK' and RV.RegNo ='375' AND 
                Fruit <> '' 
          GROUP BY  RV.Fruit,RV.RegNo) S 
    GROUP BY S.Fruit,S.RegNo order by S.Fruit

输出:

    Name    RegNo   total    Fruit
   John     375       2     Apples
   John    375        1     Oranges
   John    375        10    Grapes
   John    375        2     Pear
   John    375        14    Mango

我想要这个输出的地方

Name    RegNo   Apples Oranges   Grapes   Pear Mango    total   
John    375       2     1          10        2   14        29

那么如何得到这个结果呢?

【问题讨论】:

  • 我认为this 可以提供帮助。您需要使用 CASEs

标签: sql-server pivot pivot-table


【解决方案1】:

您可以在GROUP BY 子句中省略Fruit 字段并使用条件聚合

SELECT S.RegNo,
       SUM(total) AS total,
       SUM(CASE WHEN s.Fruit = 'Apples' THEN total ELSE 0 END) AS Apples,
       SUM(CASE WHEN s.Fruit = 'Oranges' THEN total ELSE 0 END) AS Oranges,
       SUM(CASE WHEN s.Fruit = 'Grapes' THEN total ELSE 0 END) AS Grapes,
       SUM(CASE WHEN s.Fruit = 'Pear' THEN total ELSE 0 END) AS Pear,
       SUM(CASE WHEN s.Fruit = 'Mango' THEN total ELSE 0 END) AS Mango     
FROM (
   SELECT  RV.Fruit,RV.RegNo,COUNT(vv.Fruit) as total, RV.MS 
   from vv 
   inner join RV on vv.MID= RV.ID 
   inner join Re on RV.RID=Re.RID 
   WHERE Reg.SDate>='2016-04-0100:00:00.000' and 
         Reg.EDate<= '2016-04-30 23:59:59.000' and 
         Reg.Reg= 'UK' and RV.RegNo ='375' AND 
         Fruit <> '' 
   GROUP BY RV.Fruit,RV.RegNo) S 
GROUP BY S.RegNo 

【讨论】:

  • 我不想使用条件案例..任何其他解决方案
  • 案例是一个很好的解决方案,可以比PIVOT表现更好
  • @sagi 怎么样?我听说对于这种情况,我们必须使用枢轴
  • @user6628729 实际上PIVOT 只是条件聚合的语法糖。我认为选择其中之一在性能方面没有任何区别。只需选择您觉得更舒服的方法即可。
  • 那么您可能是从没有听说过条件聚合的人那里听说的。这是一种替代方法,对于有限数量的列来说非常好。
【解决方案2】:

您可以使用 PIVOT:

SELECT  *,
        [Apples]+[Oranges]+[Grapes]+[Pear]+[Mango] as total
FROM (
    SELECT 
       S.Fruit
       ,S.RegNo
       ,SUM(total) total 
    FROM (SELECT  
              RV.Fruit
              ,RV.RegNo
              ,COUNT(vv.Fruit) as total
              , RV.MS 
          from vv inner join RV on vv.MID= RV.ID 
          inner join Re on RV.RID=Re.RID 
          WHERE Reg.SDate>='2016-04-0100:00:00.000' and 
                Reg.EDate<= '2016-04-30 23:59:59.000'  and 
                Reg.Reg= 'UK' and RV.RegNo ='375' AND 
                Fruit <> '' 
          GROUP BY  RV.Fruit,RV.RegNo) S 
    GROUP BY S.Fruit,S.RegNo order by S.Fruit
    ) t
PIVOT (
    MAX(total) FOR Fruit IN ([Apples],[Oranges],[Grapes],[Pear],[Mango])
) pvt

如果有很多水果最好使用动态SQL。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    相关资源
    最近更新 更多