我從您的問題中看不到您爲什麼需要COUNT(b.name) > 1
。但這兩方面的信息,可以這樣回收:
-- Test data
CREATE TABLE a (name varchar(20), total integer);
CREATE TABLE b (name varchar(20));
INSERT INTO a VALUES ('France', 20), ('Spain', 10),
('England', 5), ('Italy', 10), ('France', 5);
INSERT INTO b VALUES ('France'), ('Spain'), ('Italy'), ('France'), ('Greece');
SELECT c.name,
COALESCE(d.number, 0) AS rows,
COALESCE(e.total, 0) AS total
FROM
(SELECT DISTINCT name FROM a
UNION
SELECT DISTINCT name FROM b
) AS c
LEFT JOIN
( SELECT name, COUNT(1) AS number FROM b GROUP BY name) AS d
ON (c.name = d.name)
LEFT JOIN
( SELECT name, SUM(total) AS total FROM a GROUP BY name) AS e
ON (c.name = e.name);
這是效率非常低,但它的工作。如果不需要實際上需要諸如b行數等信息,那麼查詢可能會大大簡化。
以上是結果,
name rows total
France 2 25
Spain 1 10
England 0 5
Italy 1 10
Greece 1 0
注意,「行」是指將b表中的行。所以你可以有0行,就像英格蘭一樣。如果條件是行是一個或多個(在您指定的問題中您指定> 1,那麼兩個或多個),將會更容易JOIN表。
要簡單
我的目標是獲得總變量的總和每個值表B中
你可以首先從B選擇獨特的國名,然後LEFT JOIN
反對錶A的總計。要解決您使用COALESCE
的缺失國家/地區的NULL值的問題。
SELECT c.name, COALESCE(d.total, 0) AS total
FROM
(SELECT DISTINCT name FROM b) AS c
LEFT JOIN
(SELECT name, SUM(total) AS total FROM a GROUP BY name) AS d
ON (c.name = d.name)
給
France 25
Spain 10
Italy 10
Greece 0
或者:
SELECT c.name, SUM(COALESCE(a.total, 0)) AS total
FROM
(SELECT DISTINCT name FROM b) AS c
LEFT JOIN
a
ON (c.name = a.name)
GROUP BY c.name
如果你能有B中唯一的國家名稱,你可以在查詢與b
取代(SELECT DISTINCT name FROM b) AS c
(當然那麼c
小號也成爲b
)。
+1。有幾點需要注意:第一條語句中的內聯視圖中的「DISTINCT」並不是絕對必要的,因爲'UNION'操作將消除重複。此外,內聯視圖對錶A進行查詢以獲得COUNT()和SUM()可以合併爲一個內聯視圖;但內聯視圖查詢不是絕對必要的。 – spencer7593 2014-09-26 23:58:19