我有两个表:Phrase和PhraseCategory
它们与Phrase.CategoryId
== PhraseCategory.PhraseCategoryShortId
CREATE TABLE [dbo].[Phrase] (
[PhraseId] UNIQUEIDENTIFIER DEFAULT (newid()) NOT NULL,
[English] NVARCHAR (250) NOT NULL,
[CategoryId] INT NULL,
PRIMARY KEY CLUSTERED ([PhraseId] ASC)
);
CREATE TABLE [dbo].[PhraseCategory] (
[PhraseCategoryShortId] INT IDENTITY (1, 1) NOT NULL ,
[Name] VARCHAR (100) NOT NULL,
PRIMARY KEY CLUSTERED ([PhraseCategoryShortId] ASC)
);
有人可以帮我就如何加入这些建议提供一些建议,以便我得到一份如下报告:
PhraseCategory.Name Qty
这是我到目前为止所拥有的:
SELECT PhraseCategory.name, count(*) AS qty
FROM Phrase
LEFT OUTER JOIN PhraseCategory
ON Phrase.CategoryId = PhraseCategory.PhraseCategoryShortId
GROUP BY PhraseCategory.name
ORDER BY PhraseCategory.name
对我来说问题是我希望它显示短语类别名称,如果没有该类别的行,我希望它显示0。到目前为止,我无法让它发挥作用。
答案 0 :(得分:1)
我认为你有SELECT pc.name, count(p.CategoryId) AS qty
FROM PhraseCategory pc LEFT JOIN
Phrase p
ON p.CategoryId = pc.PhraseCategoryShortId
GROUP BY pc.name
ORDER BY pc.name;
倒退:
PhraseCategory
您似乎想要LEFT JOIN
中的所有内容,因此它应该是COUNT()
中的第一个表格。另请注意,0
已更改,因此它会计算第二个表中的匹配项(这是它返回 def set_icon(self, path):
icon = wx.IconFromBitmap(wx.Bitmap(path))
self.SetIcon(icon, TRAY_TOOLTIP)
的方式)。
答案 1 :(得分:1)
您的联接顺序错误,您只需要计算短语中的记录,而不是两个表:
left join
当然,您可以将right join
更改为SELECT PhraseCategory.name, count(Phrase.*) AS qty
FROM Phrase
RIGHT OUTER JOIN PhraseCategory
ON Phrase.CategoryId = PhraseCategory.PhraseCategoryShortId
GROUP BY PhraseCategory.name
ORDER BY PhraseCategory.name
并保持相同的表格顺序:
{{1}}
答案 2 :(得分:0)
尝试IFNULL
LEFT JOIN
答案 3 :(得分:0)
如果您想查看没有类别的短语和没有短语的类别的计数,可以使用full outer join.
由于Phrase.CategoryId
可以是null
,您可能希望返回字符串而不是null
,例如'没有类别'。
select
Category = coalesce(pc.name,'No Category')
, qty = count(p.PhraseId)
from Phrase p
full outer join PhraseCategory pc
on p.CategoryId = pc.PhraseCategoryShortId
group by pc.name
order by pc.name;
返回:
+-------------+-----+
| Category | qty |
+-------------+-----+
| No Category | 1 |
| ColumnNames | 3 |
| Functions | 0 |
| KeyWords | 2 |
| Users | 1 |
+-------------+-----+
测试设置:http://rextester.com/FUBSY27286
insert into phrase (English, CategoryId) values
('who',null) /* no category */
,('select',1)
,('from',1)
,('PhraseId',2)
,('English',2)
,('CategoryId',2)
,('Anne',3);
insert into PhraseCategory (Name) values
('KeyWords')
,('ColumnNames')
,('Users')
,('Functions') /*no phrases */;