【问题标题】:Join ekstra months to dataset sql将 ekstra 月加入数据集 sql
【发布时间】:2015-02-12 12:31:59
【问题描述】:

首先,感谢任何帮助我解决此问题的人。我正在使用 SQL 2012,

我有一行看起来像这样的数据:

| myPK | Name| Month |  Value | 
   1      SB        1        500    
   2      SB        4        100    

所以我现在想要的是一整年之间的月份(我有一个包含有关日期的所有信息的日期表)。结果应该是:

|  Month  | Name |  Value | 
  1      SB         500
  2      SB         0        
  3      SB         0        
  4      SB         100        
  5      SB         0        
  6      SB         0  

如何添加原始数据集中没有的所有额外月份?

【问题讨论】:

  • 即使当月没有数据,你的值真的会是 500 吗?您不希望它为 0 或 NULL 吗?
  • 对不起,是的,我希望它是 0
  • 我已经更新了我的答案。

标签: sql-server join sql-server-2012 dataset


【解决方案1】:

为了获得所需的结果,我通常会创建一个模板数据集/查询,以便它为我提供我想要在报告中显示的所有值。

然后我会 LEFT JOIN 到此模板以获取我的值并将任何 NULL 值替换为 0。

WITH ReportTemplate AS
(
    SELECT DISTINCT
        Name
        , MonthNumber

    FROM
        MyTable
        CROSS JOIN
        (
            SELECT
                MonthNumber

            FROM
                MonthDate

            WHERE
                MonthNumber BETWEEN 1 AND 6
        ) AS Months
)
, ReportData AS
(
    SELECT
        Name
        , MonthNumber
        , SUM(Value) AS Value

    FROM
        MyTable

    GROUP BY
        Name
        , MonthNumber
)

SELECT
        t.Name
    ,   t.MonthNumber
    ,   ISNULL(d.Value, 0) AS Value

FROM
    ReportTemplate AS t
    LEFT JOIN ReportData aS d
        ON  t.Name = d.Name
            AND t.MonthNumber = d.MonthNumber

【讨论】:

  • 对不起!我发的太快了,所以我用 C/P 写的,所以我把它改成了我的要求——我的错!
  • 我不确定它的工作原理。它得到相同的结果。就像我自己运行查询表单报告模板时一样,它仍然保留我拥有的当前值。
  • 哦,我想通了(必须将几个月.MontNumber 放在报告模板的前面!成功了!非常感谢 :)
  • 是的,我正要建议,因为我不知道您的架构的全部细节。您能否将此标记为您的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-02
  • 2010-10-07
  • 2020-04-04
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多