【问题标题】:SQL Server Group By result set is creating 2 seperate rows instead of 1 combined rowSQL Server Group By 结果集正在创建 2 个单独的行而不是 1 个组合行
【发布时间】:2016-10-27 01:49:42
【问题描述】:

这是我当前表格的示例:

ProjectID   Level       Cost
---------   ---------   ---------  
101         LVL_1       1000.00
101         LVL_2       2500.00
102         LVL_1       1500.00
102         LVL_2       3000.00
103         LVL_2       1200.00

当我运行以下查询时:

SELECT 
    ProjectID,
    CASE WHEN Level = 'LVL_1'
         THEN Cost
         END AS Level1,
    CASE WHEN Level = 'LVL_2'
         THEN Cost
         END AS Level2,
    SUM(Cost) 
FROM 
    Table
GROUP BY 
    Level,
    ProjectID

我得到的结果集如下:

ProjectID   Level1      Level2      TotalCost
---------   ---------   ---------   ---------
101         1000.00     NULL        3500.00
101         NULL        2500.00     3500.00
102         1500.00     NULL        4500.00
102         NULL        3000.00     4500.00
103         NULL        1200.00     1200.00

但是我需要的是这个布局:

ProjectID   Level1      Level2      TotalCost
---------   ---------   ---------   ---------
101         1000.00     2500.00     3500.00
102         1500.00     3000.00     4500.00
103         NULL        1200.00     1200.00

我意识到问题出在 Group by,因为我不想按级别分组,我只想按 ProjectID 本身分组。 但是,由于我正在使用 SUM 函数,因此我不确定如何解决此问题,我们将不胜感激。 提前致谢!

还要注意,我的查询比这更复杂。这是一个简化版。

【问题讨论】:

    标签: sql sql-server sql-server-2008 tsql group-by


    【解决方案1】:

    试试

    SELECT 
        ProjectID,
        SUM(CASE WHEN Level = 'LVL_1'
             THEN Cost ELSE 0
             END) AS Level1,
        SUM(CASE WHEN Level = 'LVL_2'
             THEN Cost ELSE 0
             END) AS Level2,
        SUM(Cost) 
    FROM 
        Table
    GROUP BY 
    
        ProjectID
    

    【讨论】:

      【解决方案2】:

      试试这个,

      SELECT 
          ProjectID,
          SUM(CASE WHEN Level = 'LVL_1'
               THEN Cost
               END) AS Level1,
          SUM(CASE WHEN Level = 'LVL_2'
               THEN Cost
               END) AS Level2,
          SUM(Cost) 
      FROM 
          Table
      GROUP BY 
          ProjectID
      

      【讨论】:

        【解决方案3】:

        试试这个

        SELECT 
                [ProjectID]
            ,   SUM(CASE WHEN [Level] = 'LVL_1' THEN [TotalCost] END) as [Level1]
            ,   SUM(CASE WHEN [Level] = 'LVL_2' THEN [TotalCost] END) as [Level2]
            ,   SUM([TotalCost]) as TotalCost
        FROM (
        
            SELECT 
                    [ProjectID]
                ,   [Level]
                ,   SUM([Cost]) as TotalCost
            FROM 
                [Table]
            GROUP BY
                    [ProjectID]
                ,   [Level]
        
            ) t
        GROUP BY
                t.[ProjectID]
        

        【讨论】:

          【解决方案4】:

          试试这个,希望对你有帮助……

             SELECT 
                  ProjectID,
                  max(CASE WHEN Level = 'LVL_1'
                       THEN Cost
                       END) AS Level1,
                  max(CASE WHEN Level = 'LVL_2'
                       THEN Cost
                       END) AS Level2,
                  SUM(Cost) 
              FROM 
                  Table
              GROUP BY 
                  ProjectID
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-01-01
            • 2015-05-11
            • 1970-01-01
            • 1970-01-01
            • 2021-08-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多