我们如何编写下面的 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,2,3,4,90 与合并 1 关联)。仅保留最小(主要)数字 - 在本例中为 1
不要显示带有 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
或者,您可以使用常见的 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]
我有一个包含 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,2,3,4,90 与合并 1 关联)。仅保留最小(主要)数字 - 在本例中为 1
不要显示带有 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
或者,您可以使用常见的 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]