![](/img/trans.png)
[英]SQL query to find rows where a column value is equal to the sum of tow other columns in the same row
[英]SQL Query to Group/SUM Columns C, D, when A, B are equal
我有一個有4列的MySQL表,我們稱之為C1,C2,C3和C4。
在這個數據中,我有一個這樣的數據集:
C1,C2,C3,C4
A,B,12,24
C,D,23,13
A,D,19,15
B,C,15,15
A,C,21,9
B,D,19,2
B,A,8,19
D,C,29,1
我需要獲得如下輸出:
A,71
B,66
D,59
C,48
我試圖編寫一個查詢,但是當兩個其他字段相等並對它們進行分組/排序時,我似乎無法理解如何對兩個字段進行求和。
SELECT C1, SUM(C3,C4) AS Total
WHERE C1 = C2
GROUP BY C1
ORDER BY C1 Desc;
這返回一個空集,我知道為什么,因為C1和C2在同一行不相等,但似乎無法弄清楚下一步該做什么。
第一個解決方案(MySql 8.0):
WITH d AS (
SELECT DISTINCT C1 AS name FROM tablename
UNION
SELECT DISTINCT C2 AS name FROM tablename
)
SELECT tt.name, SUM(tt.value) AS total FROM (
SELECT
d.name,
CASE WHEN t.C1 = d.name THEN C3 ELSE 0 END + CASE WHEN t.C2 = d.name THEN C4 ELSE 0 END AS value
FROM d
INNER JOIN tablename AS t
ON t.C1 = d.name OR t.C2 = d.name
) AS tt
GROUP BY name;
見演示
第二個解決方案(MySql 5.7):
SELECT tt.name, SUM(tt.value) AS total FROM (
SELECT
d.name,
CASE WHEN t.C1 = d.name THEN C3 ELSE 0 END + CASE WHEN t.C2 = d.name THEN C4 ELSE 0 END AS value
FROM (
SELECT DISTINCT C1 AS name FROM tablename
UNION
SELECT DISTINCT C2 AS name FROM tablename
) AS d
INNER JOIN tablename AS t
ON t.C1 = d.name OR t.C2 = d.name
) AS tt
GROUP BY name;
見演示
我會這樣做:
select col, sum(val)
from ((select c1 as col, c3 as val from t
) union all
(select c2, c4 from t
)
) cc
group by col;
對於您提供的數據,這似乎是最簡單的方法。 與使用or
處於join
條件的方法相比,這應該具有更好的性能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.