假设这些表:
群组 :(身份证,标题):{1,G1}, {2,G2}, {3,G3}, {4, G4}
类别 :( Id,标题):{1, Cat1}, {2, Cat2}, {3, Cat3}, {4, Cat4}
产品 :( Id,GroupId,CategoryId,Name):
{1, 1, 1, G1C1P1},
{2, 1, 2, G1C2P2},
{3, 1, 2, G1C2P3},
{4, 2, 2, G2C2P4},
{5, 2, 2, G2C2P5},
{6, 3, 1, G3C1P6},
{7, 3, 3, G3C3P7}
所以我需要的是上述值的任何类别的计数是:
Group Category Count
----------------------
G1 Cat1 1
G1 Cat2 2
G1 Cat3 0
G1 Cat4 0
G2 Cat1 0
G2 Cat2 2
G2 Cat3 0
G2 Cat4 0
G3 Cat1 1
G3 Cat2 0
G3 Cat3 1
G3 Cat4 0
G4 Cat1 0
G4 Cat2 0
G4 Cat3 0
G4 Cat4 0
我试试这个:
SELECT
[GR].[Title] AS [Group],
COUNT([PR].[Id]) AS [Count],
[CA].[Title]
FROM [dbo].[Group] AS [GR]
FULL OUTER JOIN [dbo].[Product] AS [PR] ON [GR].[Id] = [PR].[GroupId]
FULL OUTER JOIN [dbo].[Category] AS [CA] ON [PR].[CategoryId] = [CA].[Id]
GROUP BY [CA].[Title], [GR].[Title];
GO
但这不是确切的,所以你的建议是什么?
答案 0 :(得分:4)
您需要CROSS JOIN
两个表(Group
和Category
)创建所有可能的组类别组合,然后LEFT JOIN
创建Product
表:
SELECT
gr.Title AS [Group],
ca.Title,
COUNT(pr.Id) AS [Count]
FROM
dbo.[Group] AS gr
CROSS JOIN
dbo.Category AS ca
LEFT OUTER JOIN
dbo.Product AS pr
ON pr.GroupId = gr.Id
AND pr.CategoryId = ca.Id
GROUP BY
gr.Title,
ca.Title
ORDER BY
gr.Title,
ca.Title ;
或以这种方式(Products表中的第一个GROUP BY
然后加入派生表):
SELECT
gr.Title AS [Group],
ca.Title,
COALESCE(pr.cnt, 0) AS [Count]
FROM
dbo.[Group] AS gr
CROSS JOIN
dbo.Category AS ca
LEFT OUTER JOIN
( SELECT
GroupId,
CategoryId,
COUNT(*) AS cnt
FROM
dbo.Product
GROUP BY
GroupId,
CategoryId
) AS pr
ON pr.GroupId = gr.Id
AND pr.CategoryId = ca.Id
ORDER BY
gr.Id,
ca.Id ;
如果Group(Title)
和Category(Title)
列是唯一的,则查询是等效的(排序除外)。
答案 1 :(得分:0)
试试这个:
SELECT
[GR].[Title] AS [Group],
[CA].[Title],
COUNT([PR].[Id]) AS [Count]
FROM [dbo].[Product] AS [PR]
FULL OUTER JOIN [dbo].[Group] AS [GR] ON [PR].[GroupId] = [GR].[Id]
FULL OUTER JOIN [dbo].[Category] AS [CA] ON [PR].[CategoryId] = [CA].[Id]
GROUP BY [GR].[Title],[CA].[Title];
GO