繁体   English   中英

如何联接多个表,而不忽略不匹配的值

[英]How to join multiple tables, without omitting values without a match

这个小例子基于一个我无数次遇到的问题,但是我找不到最佳答案。

我想创建有关每种类型每月记录的事件的报告。 编写以下查询。

SELECT
    d.MonthPeriod
    ,i.[Type]
    ,COUNT(*) AS [Count of Calls]
FROM
    [dbo].[FactIncident] as i
        LEFT JOIN
    [dbo].[DimDate] as d on i.DateLoggedKey = d.DateKey
GROUP BY
    d.[MonthPeriod],
    i.[Type]

结果如下:

在此处输入图片说明

虽然正确,但我想将0个已记录的呼叫显示在前几个月。 DimDate包含以下内容。

在此处输入图片说明

显示所有月份每月每种类型的呼叫次数的最佳和/或最有效的方法是什么。 即使计数为0?

考虑使用Cross Apply,但是结果查询迅速变得庞大。 仅考虑一个数据集,该数据集需要过去三年中每个客户每个类别每个月的呼叫计数。

有任何想法吗?

从日历表开始进行left join ,因此保留所有月份:

SELECT d.MonthPeriod, i.[Type], COUNT(i.type) AS [Count of Calls]
FROM [dbo].[DimDate] d LEFT JOIN
     [dbo].[FactIncident] i
     ON i.DateLoggedKey = d.DateKey
GROUP BY d.[MonthPeriod], i.[Type];

当然,这将在没有数据的月份中将type返回为NULL

如果要显示所有类型,请在这些类型上使用CROSS JOIN 本示例从事实表获取数据,但是您可能还有另一个包含每种类型的参考表:

SELECT d.MonthPeriod, t.[Type], COUNT(i.type) AS [Count of Calls]
FROM [dbo].[DimDate] d CROSS JOIN
     (select distinct type from factincident) t LEFT JOIN
     [dbo].[FactIncident] i
     ON i.DateLoggedKey = d.DateKey and i.type = t.type
GROUP BY d.[MonthPeriod], t.[Type];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM