2014-05-14 65 views
0

我有兩個這樣的表。查詢計數條目

A B 
1 12 
2 13 
3 12 
4 13 
5 15 


B C 
12 APPLE 
13 ORANGE 
14 MANGO 
15 BANANA 

我需要如下輸出...

count(A) B C 
2   12 APPLE 
2   13 ORANGE 
0   14 MANGO 
1   15 BANANA 

我寫使用查詢連接,但我停留在空值時,顯示計數爲零。

回答

3

使用left join得到的table2值即使有沒有爲他們記錄table1

select T2.B, T2.C, count(T1.A) 
from table2 T2 
left join table1 T1 on T1.B = T2.B 
group by T2.B, T2.C 
+1

你忘了添加GROUP BY子句。 –

+0

我是唯一一個仍然喜歡在連接中看到'OUTER'以完整性的人嗎?我必須變老,乖乖或什麼。 –

2

試試這個:

SELECT COUNT(T1.A) as Cnt,T2.B,T2.C 
FROM Table2 T2 LEFT JOIN 
    Table1 T1 ON T1.B=T2.B 
GROUP BY T2.B,T2.C 

結果:

CNT B  C 
2  12 APPLE 
1  15 BANANA 
0  14 MANGO 
2  13 ORANGE 

見導致SQL Fiddle

0
DECLARE @TABLE1 TABLE (A INT, B INT) 
INSERT INTO @TABLE1 VALUES 
(1, 12), 
(2, 13), 
(3, 12), 
(4, 13), 
(5, 15) 

DECLARE @TABLE2 TABLE (B INT, C VARCHAR(20)) 
INSERT INTO @TABLE2 VALUES 
(12,'APPLE'), 
(13,'ORANGE'), 
(14,'MANGO'), 
(15,'BANANA') 




SELECT t2.C 
     ,ISNULL(COUNT(t1.B), 0) total_Count 
FROM @TABLE2 t2 LEFT JOIN @TABLE1 t1 
ON t2.B = t1.B 
GROUP BY t2.C 


C  total_Count 
APPLE 2 
BANANA 1 
MANGO 0 
ORANGE 2 
1

只是給你另一種選擇。您不需要連接,因爲您只想顯示table2記錄以及可以在子查詢中獲得的另一個值。

select (select count(*) from table1 where table1.B = table2.B) as cnt, B, C 
from table2 
order by B; 
1

還有其他的方法來做到這一點(使用子查詢),但我會用這個下列操作之一:

-- SETUP 
CREATE TABLE #TABLE1 (A INT, B INT); 
CREATE TABLE #TABLE2 (B INT, C CHAR(10)); 

INSERT #TABLE1 
SELECT 1, 12 UNION ALL 
SELECT 2, 13 UNION ALL 
SELECT 3, 12 UNION ALL 
SELECT 4, 13 UNION ALL 
SELECT 5, 15 

INSERT #TABLE2 
SELECT 12, 'APPLE' UNION ALL 
SELECT 13, 'ORANGE' UNION ALL 
SELECT 14, 'MANGO' UNION ALL 
SELECT 15, 'BANANA' 

-- query 
SELECT COUNT(qty.A), dsc.B, dsc.C 
FROM  #TABLE2 dsc 
LEFT JOIN #TABLE1 qty ON (dsc.B = qty.B) 
GROUP BY dsc.B, dsc.C 
ORDER BY dsc.B, dsc.C;