[英]How to SUM of SUMS of fields with same value in MYSQL
我有這些表:當KEY3 = X時,我需要用相同的KEY1和KEY2來“求和”所有值
| KEY1 | VALUE1 | KEY2 | VALUE2 | KEY3 |
| 1 | 9 | 2 | 2 | x |
| 1 | 10 | 2 | 3 | x |
| 2 | 5 | 1 | 8 | x |
| 2 | 5 | 1 | 9 | y |
從表1那里選擇key1作為k1,選擇key2作為k2 WHERE key3 = x
對於這些查詢的每個結果,我需要執行以下操作:
SELECT
COALESCE(SUM(case when key1 = k1 then totalamount1 else 0 end),0) +
COALESCE(SUM(case when key2 = k2 then totalamount2 else 0 end),0) as total
FROM table1
WHERE key3 = x
Y需要這些輸出:
Total
id 1: 27
id 2: 10
如何加入這兩個查詢?
謝謝!
最簡單的方法是“取消透視表”:
SELECT
Key,
SUM(Value) AS Total
FROM (
SELECT Key3, Key1 AS Key, Value1 AS Value FROM Table1
UNION ALL SELECT Key3, Key2, Value2 FROM Table1
) NormTable
WHERE Key3 = 'x'
GROUP BY Key
您也可以將WHERE Key3 = 'x'
移到每個聯合查詢中。 這樣會更快,但更容易出錯,因為如果需要不同的Key3
值,則需要在每個查詢中進行更改。 您打來的那個。
這是獲得結果的一種方法:
SELECT IF(i.i,t.key1,t.key2) AS `id`
, SUM(IF(i.i,t.value1,t.value2)) AS `Total`
FROM table1 t
CROSS
JOIN (SELECT 0 AS i UNION ALL SELECT 1) i
WHERE t.key3 = 'x'
GROUP
BY IF(i.i,t.key1,t.key2)
SQL Fiddle演示在這里:http://sqlfiddle.com/#!2/d7599f/1
我使用的“技巧”是通過執行table1與一組恰好包含兩行的交叉連接來獲得兩組行。 這兩個行可以通過條件測試相互區分。
由於ii
的值將為1
或0
,這意味着它將作為IF函數中的條件測試求值為TRUE和FALSE。
我們可以從一組行中提取(key1,value1),並從另一組行中提取(key2,value2),本質上,創建如下結果集:
| i | keyN | valueN |
| 1 | 1 | 9 |
| 1 | 1 | 10 |
| 1 | 2 | 5 |
| 0 | 2 | 2 |
| 0 | 2 | 3 |
| 0 | 1 | 8 |
現在,只需要執行一個SUM(valueN) GROUP BY keyN
上面的查詢可以用(更可移植的)SQL-92樣式重寫:
SELECT CASE WHEN i.i = 1 THEN t.key1 ELSE t.key2 END AS `id`
, SUM(CASE WHEN i.i = 1 THEN t.value1 ELSE t.value2) AS `Total`
FROM table1 t
CROSS
JOIN (SELECT 0 AS i UNION ALL SELECT 1) i
WHERE t.key3 = 'x'
GROUP
BY CASE WHEN i.i = 1 THEN t.key1 ELSE t.key2 END AS `id`
(對於Oracle,我們需要在別名為i的嵌入式視圖中的每個選擇上添加FROM DUAL
。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.