如果没有匹配的行,如何让Group By显示0?

时间:2017-02-25 13:28:09

标签: sql-server

我有两个表: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。到目前为止,我无法让它发挥作用。

4 个答案:

答案 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 */;