T-SQL查询不会为求和返回0值

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 提前谢谢 -----------------------------------------------------------

我有一个问题,我在哪里计算药物治疗的天数。我想为没有数据的月份显示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
之前对其进行处理,因此也就是聚合,因此您不会得到这些月份的行。使用数字或计数表来提供所需的月份范围,并使用
外部联接来添加数据,这将使您获得所需的结果。