【问题标题】:Generate 0 or Null values for data that doesn't exist [duplicate]为不存在的数据生成 0 或 Null 值
【发布时间】:2014-06-20 18:38:33
【问题描述】:

我有一些数据,我试图使用带有 SSRS 的图表来表示。在生成此报告之前,我试图说明确实存在的数据。我已经建立了一个汇总每日总数的小型数据集市。对于某些组,特定周的数据不存在。我正在寻找一种方法来解释该数据,因此当我开始生成报告时,折线图表示实际数据,0 表示确实存在的值。举个例子:

yearnbr     weeknbr      restaurant     mealsserved
 2014        1           Joes Pasta     5
 2014        2           Joes Pasta     4
 2014        4           Joes Pasta     2

对于上面的示例,第三周的数据不存在。我想生成一个可以为第 3 周插入 0 或 null 值的查询。当我生成报告时,第 2 周和第 4 周的数据连接。我需要在第 3 周插入 0 或 Null。我使用的是 SQL Server 2008 R2。

【问题讨论】:

    标签: sql sql-server reporting-services sql-server-2008-r2


    【解决方案1】:

    您需要有一个结果集才能加入。

    您可以即时生成它:

    WITH    weeks (w) AS
            (
            SELECT  1
            UNION ALL
            SELECT  w + 1
            FROM    weeks
            WHERE   w < 54
            )
    SELECT  *
    FROM    weeks
    LEFT JOIN
            sales
    ON      year = 2014
            AND weeknbr = w
    

    但性能会很差。

    最好用数字创建和填充表格(一次):

    CREATE TABLE num (n INT NOT NULL PRIMARY KEY)
    
    WITH    q (n) AS
            (
            SELECT  1
            UNION ALL
            SELECT  n + 1
            FROM    q
            WHERE   n < 100000
            )
    INSERT
    INTO    num
    SELECT  n
    FROM    q
    

    然后在上面的查询中使用它:

    SELECT  *
    FROM    num
    LEFT JOIN
            sales
    ON      year = 2014
            AND weeknbr = n
    

    【讨论】:

      【解决方案2】:

      测试数据

      DECLARE @TABLE TABLE 
        (
         yearnbr     INT,
         weeknbr     INT,
         restaurant  VARCHAR(20),
         mealsserved INT
         )
      INSERT INTO @TABLE VALUES 
       (2014 ,1 ,'Joes Pasta',5),
       (2014 ,2 ,'Joes Pasta',4),
       (2014 ,4 ,'Joes Pasta',2)
      

      查询

      SELECT COALESCE(yearnbr,[Year]) AS yearnbr
            ,COALESCE(weeknbr,[Week]) AS weeknbr
            ,ISNULL(restaurant, '')   AS restaurant
            ,ISNULL(mealsserved, 0)   AS mealsserved 
      FROM @TABLE t RIGHT JOIN 
                          (
                          VALUES (YEAR(GETDATE()), 1),
                                 (YEAR(GETDATE()), 2),
                                 (YEAR(GETDATE()), 3),
                                 (YEAR(GETDATE()), 4)
                          ) A([Year],[Week])
      ON t.yearnbr = A.[Year] AND t.weeknbr = A.[Week]
      

      结果

      ╔═════════╦═════════╦════════════╦═════════════╗
      ║ yearnbr ║ weeknbr ║ restaurant ║ mealsserved ║
      ╠═════════╬═════════╬════════════╬═════════════╣
      ║    2014 ║       1 ║ Joes Pasta ║           5 ║
      ║    2014 ║       2 ║ Joes Pasta ║           4 ║
      ║    2014 ║       3 ║            ║           0 ║
      ║    2014 ║       4 ║ Joes Pasta ║           2 ║
      ╚═════════╩═════════╩════════════╩═════════════╝
      

      【讨论】:

        【解决方案3】:

        您可以Join 获取周数表。您可以尝试以下一种方法:

        Declare @Week Table (N TinyInt Not Null)
        Insert  @Week Values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9) 
        
        Select  *
        From    Table   T
        Right Join
        (
            Select      (A.N + (10 * B.N))  Week
            From        @Week   A
            Cross Join  @Week   B
        ) W On T.weeknbr = W.Week
        Where   W.Week Between 1 And 52
        Order By W.Week
        

        【讨论】:

          猜你喜欢
          • 2022-10-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-03
          • 2017-01-26
          • 1970-01-01
          相关资源
          最近更新 更多