2016-12-06 47 views
0

我想要顯示AlbumCategories,其計數爲Albums它具有以下所示的每個類別。SQL查詢獲取SQL Server中所有類別的相冊的相冊計數

期望的結果:

Sports(2) 
Education(3) 
Community(0) 
Something(0) 

查詢:

SELECT 
    AC.ACID, MAX(AC.Name) as Name, 
    COUNT(*) as Frequency 
FROM 
    Album A 
INNER JOIN 
    AlbumCategories AC ON A.ACID = AC.ACID 
GROUP BY 
    AC.ACID 

此查詢僅返回AlbumCategories具有相冊上述查詢的樣本輸出

Sports(2) 
Education(3) 

AlbumCategories

ACID Name 
1  Sports 
2  Education 
3  Community 
4  Something 

相冊

AID  ACID Name 
1  1  Footbal season 2015 
2  1  Footbal season 2016 
3  2  Album one 
4  2  Album Two 
5  2  Album Three 

AlbumsPhotos

PID  AID Image 
+4

改爲使用'LEFT JOIN'。 –

回答

2

你需要使用RIGHT JOININNER JOIN僅提取連接表之間的匹配記錄。從Album表數列不使用*

架構設置

CREATE TABLE AlbumCategories 
    ([ACID] int, [Name] varchar(9)) 
; 

INSERT INTO AlbumCategories 
    ([ACID], [Name]) 
VALUES 
    (1, 'Sports'), 
    (2, 'Education'), 
    (3, 'Community'), 
    (4, 'Something'); 


CREATE TABLE albums 
    ([AID] int, [ACID] int, [Name] varchar(19)) 
; 

INSERT INTO albums 
    ([AID], [ACID], [Name]) 
VALUES 
    (1, 1, 'Footbal season 2015'), 
    (2, 1, 'Footbal season 2016'), 
    (3, 2, 'Album one'), 
    (4, 2, 'Album Two'), 
    (5, 2, 'Album Three'); 

查詢

SELECT AC.ACID, 
     AC.NAME  AS NAME, 
     Count(A.ACID) AS Frequency 
FROM albums A 
     RIGHT JOIN AlbumCategories AC 
       ON A.ACID = AC.ACID 
GROUP BY AC.ACID, 
      AC.NAME 

結果:

╔══════╦═══════════╦═══════════╗ 
║ ACID ║ NAME ║ Frequency ║ 
╠══════╬═══════════╬═══════════╣ 
║ 1 ║ Sports ║   2 ║ 
║ 2 ║ Education ║   3 ║ 
║ 3 ║ Community ║   0 ║ 
║ 4 ║ Something ║   0 ║ 
╚══════╩═══════════╩═══════════╝ 
+0

我的意思是使用RIGHT JOIN讓每個記錄的頻率爲1的所有記錄。 – Learning

+2

'COUNT(*)'可能會給你'1',但這不是這個答案建議你使用的。更仔細地閱讀答案。 – MatBailie

+0

@學習 - 這可能是因爲你仍在使用'*'計數聚集。新增了演示 –