我们如何编写下面的 SQL 查询

How do we write a SQL query for below

我有一个包含 3 列的 table MyTable - Main、Merge、Count

Main   Merge    Count
1      1        11
2      1        7
3      1        1
4      1        4
90     1        3
2      2        7
3      2        1
4      2        4
3      3        1
4      3        4
9      10       17
10     10       14
11     11       16
12     11       1
13     11       21
12     12       1
13     12       21

我的结果应该是:

Main   Merge    Count
1      1        26  (Add up all counts based on Merge 11+7+1+4+3)
9      10       31  (17+14)
11     11       38  (16+1+21)

逻辑: 1.根据Merge

得到所有的Sum(Count)
  1. 检查所有与合并关联的主列(例如 1,2,3,4,90 与合并 1 关联)。仅保留最小(主要)数字 - 在本例中为 1

  2. 不要显示带有 2,3,4,90 的任何记录,因为它已经在计算中考虑过了。因此不会显示带有 2,3,4,90 的 Main Col

对于 Merge 10 - Main 9 和 10 关联。我们只需要显示 Main 9,但总数将是 Merge 10

的总和

对于 Merge 11 - Main 11,12 和 13 关联。我们需要合并总数为 11(即 16+1+21 = 38)。主要 12、13 不会出现在结果中

您可以使用 EXISTS 消除先前计数的行,并对 SUM 使用简单聚合;

SELECT MIN([Main]) [Main], [Merge], SUM([Count]) [Count]
FROM myTable
WHERE NOT EXISTS (
  SELECT 1 FROM myTable a 
  WHERE a.[Main] = myTable.[Main]
    AND a.[Merge] < myTable.[Merge]
)
GROUP BY [Merge]
ORDER BY [Merge]

Main    Merge   Count
1        1      26
9       10      31
11      11      38

An SQLfiddle to test with.

或者,您可以使用常见的 table 表达式来计算每次 Main 的某个值出现的次数,按照 Merge 的最低值到最高值的顺序,并且仅使用第一次出现;

;WITH cte AS (
  SELECT *, RANK() OVER (PARTITION BY [Main] ORDER BY [Merge]) rn  FROM myTable
)
SELECT MIN([Main]) [Main], [Merge], SUM([Count]) [Count]
FROM cte
WHERE rn = 1
GROUP BY [Merge]
ORDER BY [Merge]

Another SQLfiddle