T-SQL查询不会为求和返回0值
我有一个问题,我在哪里计算药物治疗的天数。我想为没有数据的月份显示0个值。当前,如果总和为0,则查询不返回任何记录。我似乎无法理解这一点。请参见下面的查询: 如果我要注释掉与DOT_ALL表相关的标识符以及Where子句,我会得到60行,在过去5年中每个月1行。然而,由于2016年8月、2016年4月和2015年1月没有DOTs,因此Where条款中的药物我只得到57 提前谢谢T-SQL查询不会为求和返回0值,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个问题,我在哪里计算药物治疗的天数。我想为没有数据的月份显示0个值。当前,如果总和为0,则查询不返回任何记录。我似乎无法理解这一点。请参见下面的查询: 如果我要注释掉与DOT_ALL表相关的标识符以及Where子句,我会得到60行,在过去5年中每个月1行。然而,由于2016年8月、2016年4月和2015年1月没有DOTs,因此Where条款中的药物我只得到57 提前谢谢 -----------------------------------------------------------
----------------------------------------------------------------------------
SELECT
AMS.[Medication Name]
, SUM(AMS.DOT) AS DOT
, PD.[Patient Days]
, PD.[Month_Name]
, PD.[Fiscal_Month]
, PD.[Accounting_Year]
, PD.[Year]
FROM
DW_PROD.dbo.Patient_Days_By_Month PD
Left JOIN [DW_PROD].[dbo].[DOTS_All] AMS ON (PD.Month_Name = AMS.Month AND PD.Year = AMS.Year)
WHERE
[Medication Name] = 'CEFUROXIME'
GROUP BY
AMS.[Medication Name]
, PD.[Patient Days]
, PD.[Month_Name]
, PD.[Fiscal_Month]
, PD.[Accounting_Year]
, PD.[Year]
ORDER BY
ACCOUNTING_YEAR
,FISCAL_MONTH
这可能是最便宜的解决方案,前提是
每个月的患者天数已经是某种日历了
SELECT
'CEFUROXIME' AS [Medication Name],
SUM(AMS.DOT) AS DOT,
PD.[Patient Days],
PD.[Month_Name],
PD.[Fiscal_Month],
PD.[Accounting_Year],
PD.[Year]
FROM DW_PROD.dbo.Patient_Days_By_Month PD
LEFT JOIN [DW_PROD].[dbo].[DOTS_All] AMS
ON PD.Month_Name = AMS.Month
AND PD.Year = AMS.Year
AND [Medication Name] = 'CEFUROXIME'
GROUP BY
PD.[Patient Days],
PD.[Month_Name],
PD.[Fiscal_Month],
PD.[Accounting_Year],
PD.[Year]
ORDER BY
PD.ACCOUNTING_YEAR,
PD.FISCAL_MONTH
联接条件不需要引用其他表中的列,也可以引用
药物名称最初被限制在WHERE
条款中,该条款将所有非头孢呋辛记录从结果集中删除。这可能是最便宜的解决方案,前提是每个月的患者天数
已经是某种日历
SELECT
'CEFUROXIME' AS [Medication Name],
SUM(AMS.DOT) AS DOT,
PD.[Patient Days],
PD.[Month_Name],
PD.[Fiscal_Month],
PD.[Accounting_Year],
PD.[Year]
FROM DW_PROD.dbo.Patient_Days_By_Month PD
LEFT JOIN [DW_PROD].[dbo].[DOTS_All] AMS
ON PD.Month_Name = AMS.Month
AND PD.Year = AMS.Year
AND [Medication Name] = 'CEFUROXIME'
GROUP BY
PD.[Patient Days],
PD.[Month_Name],
PD.[Fiscal_Month],
PD.[Accounting_Year],
PD.[Year]
ORDER BY
PD.ACCOUNTING_YEAR,
PD.FISCAL_MONTH
联接条件不需要引用其他表中的列,也可以引用
药物名称最初限制在WHERE
子句中,该子句从结果集中删除了所有非头孢呋辛记录。药物名称将是一列DOTS\u all
(?),它位于WHERE
中,因此它将限制整个结果集。尝试将其添加为附加的联接条件。潜在dup:使用日期表(cte、子查询、硬编码等),然后从该表左键联接两个表。本文可能会帮助您理解查询元素处理的逻辑顺序。由于您的WHERE
子句消除了一些月份,并且在SELECT
之前对其进行处理,因此也就是聚合,因此您不会得到这些月份的行。使用数字或计数表来提供所需的月份范围和外部联接
来添加数据将使您获得所需的结果。药物名称
将是一列点全部
(?),它位于位置
,因此将限制整个结果集。尝试将其添加为附加的联接条件。潜在dup:使用日期表(cte、子查询、硬编码等),然后从该表左键联接两个表。本文可能会帮助您理解查询元素处理的逻辑顺序。由于您的WHERE
子句消除了一些月份,并且在SELECT
之前对其进行处理,因此也就是聚合,因此您不会得到这些月份的行。使用数字或计数表来提供所需的月份范围,并使用外部联接来添加数据,这将使您获得所需的结果。