【问题标题】:SQL sum field and select a column (with condition) and sum another columnSQL求和字段并选择一列(带条件)并对另一列求和
【发布时间】:2013-06-13 15:42:24
【问题描述】:

我有一个选择语句:

  SELECT ID, A, B, C, D
    FROM MyTable
GROUP BY ID, A, B, C, D
  HAVING D >= '14/06/2013'
     AND D <= '17/06/2013'

显示这个:

ID   |    A   |    B    |   C   |     D   
--------------------------------------------
11   |  1370  |    0    |  0    |  14/06/2013
11   |  1370  |   100   |  0    |  15/06/2013
11   |  1470  |   400   |  0    |  16/06/2013
11   |  1870  |    0    | 300   |  17/06/2013

我想要的结果是:

ID   | min of D|  Sum(B) |  Sum(C) |  max of D|   MIN(D)
11   |  1370   |   500   |   300   |   1870   |  14/06/2013

我如何在 SQL Server 上做到这一点

【问题讨论】:

    标签: sql tsql group-by sum conditional-statements


    【解决方案1】:

    这是一种方法(假设 SQL Server 2005+):

    ;WITH CTE AS
    (
        SELECT  *,
                RN1 = ROW_NUMBER() OVER(PARTITION BY ID ORDER BY D DESC),
                RN2 = ROW_NUMBER() OVER(PARTITION BY ID ORDER BY D)
        FROM YourTable
        WHERE D >= '20130614'
        AND D <= '20130617'
    )
    SELECT  ID,
            MIN(CASE WHEN RN2 = 1 THEN A END) [min of D],
            SUM(B) [Sum(B)],
            SUM(C) [Sum(C)],
            MIN(CASE WHEN RN1 = 1 THEN A END) [max of D],
            MIN(D) [Min(D)]
    FROM CTE
    GROUP BY ID
    

    结果:

    ╔════╦══════════╦════════╦════════╦══════════╦════════════╗
    ║ ID ║ MIN OF D ║ SUM(B) ║ SUM(C) ║ MAX OF D ║  MIN(D)    ║
    ╠════╬══════════╬════════╬════════╬══════════╬════════════╣
    ║ 11 ║     1370 ║    500 ║    300 ║     1870 ║ 2013-06-14 ║
    ╚════╩══════════╩════════╩════════╩══════════╩════════════╝
    

    还有here is an sqlfiddle 的演示。

    【讨论】:

    • 为什么要在这种情况下使用 CTE?
    • @Goat_CO 主要是为了方便。您的答案实际上是不正确的,因为 op 想要 A 的最小值作为 D 的最小值,然后对于 D 的最大值相同,这两个值与最大值和最小值相同A 在这种情况下,但这是一个巧合。我为此使用ROW_NUMBER,我发现 CTE 比派生表更容易理解
    • 有道理,这个问题没有说清楚,但看起来你做出了正确的假设。
    【解决方案2】:

    你可以通过 JOIN 来做到这一点

    SELECT  T.ID ,
            MAX(G.B) AS [SUM(B)],
            MAX(G.C) AS [SUM(C)],
            MAX(MINI)AS [MIN(D)] ,
            MAX(CASE WHEN T.D = G.MINI THEN T.A ELSE NULL END ) AS [MIN OF D],
            MAX(CASE WHEN T.D = G.MAXI THEN T.A ELSE NULL END ) AS [MAX OF D]
    FROM    TEST T
    JOIN    ( SELECT ID , SUM(B) B ,SUM(C) C ,MIN(D) AS MINI ,MAX(D) AS MAXI
              FROM  test 
              WHERE D >= '06/14/2013'
                 AND D <= '06/17/2013'
              GROUP BY  ID ) G ON G.ID = T.ID
    GROUP BY T.ID
    

    SQL Fiddle 演示 HERE

    【讨论】:

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