【问题标题】:SQL - Get a pair of rows depending on the sum of values from a columnSQL - 根据列中值的总和获取一对行
【发布时间】:2018-08-18 03:53:54
【问题描述】:

我的桌子看起来像这样:

+------+------+-------+------+
| ColA | ColB | ColC  | ColD |
+------+------+-------+------+
| 1    | 1    | 10217 | 5    |
+------+------+-------+------+
| 1    | 2    | 10217 | 6    |
+------+------+-------+------+
| 1    | 1    | 10417 | 7    |
+------+------+-------+------+
| 1    | 2    | 10417 | 8    |
+------+------+-------+------+
| 2    | 1    | 10417 | 9    |
+------+------+-------+------+
| 2    | 2    | 10417 | 10   |
+------+------+-------+------+

如何编写一个返回一对具有以下要求的行的查询:

  1. 输入 ColA 值和 ColC 范围作为参数后

    例如ColA: 1 ColC: 10217 to 10417

表格应如下所示:

+------+------+-------+------+
| ColA | ColB | ColC  | ColD |
+------+------+-------+------+
| 1    | 1    | 10217 | 5    |
+------+------+-------+------+
| 1    | 2    | 10217 | 6    |
+------+------+-------+------+
| 1    | 1    | 10417 | 7    |
+------+------+-------+------+
| 1    | 2    | 10417 | 8    |
+------+------+-------+------+
  1. 现在为特定 ColC 值的每个 ColB 配对添加 ColD 值。使用我的示例,对于 ColC 值 10217,它将是 5 + 6,而 ColC 值 10417 将是 7 + 8
  2. 然后得到两个和之间的最大值。所以应该是 15 > 11。
  3. 最后,返回因获得上述最大值(即 15)而产生的行配对。

最终结果应该是这样的:

+------+------+-------+------+
| ColA | ColB | ColC  | ColD |
+------+------+-------+------+
| 1    | 1    | 10417 | 7    |
+------+------+-------+------+
| 1    | 2    | 10417 | 8    |
+------+------+-------+------+

我只达到了最大的部分。我在尝试获取行配对时遇到了麻烦。

SELECT Max(sumD) AS maxSumD
FROM (SELECT t1.ColA, t1.ColB, sum(ColD) AS sumD 
        FROM (SELECT * 
                FROM Table1 
                WHERE (ColA = paramA) and (ColC between paramFromC and paramToC))  AS t1 
        GROUP BY t1.ColA, t1.ColB)  

解决方案:使用 Ctznkane 的回答,我找到了这个(hacky)解决方案:

SELECT TOP 2 SUMMEDVALUE, ColA, ColB, ColC, ColD
FROM (SELECT A.ColA, A.ColB, A.ColC, A.ColD, (A.ColD+B.ColD) as SUMMEDVALUE
      FROM Table1 A
      INNER JOIN Table1 B 
      ON A.ColA=B.ColA AND A.ColC=B.ColC AND t1.ColB<>t2.ColB) 
ORDER BY SUMMEDVALUE DESC

【问题讨论】:

    标签: sql sum max


    【解决方案1】:

    如果您正在寻找一对行,那么您应该将表与自身连接起来。

    SELECT (A.COLD+B.COLD) SUMMEDVALUE, A.COLC, A.COLB, B.COLB, A.COLD, B.COLD
    FROM TABLE1 A
        INNER JOIN TABLE1 B ON A.COLA=B.COLA AND A.COLC=B.COLC AND A.COLB<>B.COLB
    

    【讨论】:

    • 谢谢!我更新了我的帖子,以包含使用您的答案找到的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 2016-09-24
    相关资源
    最近更新 更多