2014-06-20 27 views
1

我有一些數據我試圖用SSRS表示。在我能夠生成此報告之前,我正在考慮確實存在的數據。我已經建立了一個彙總每日總計的小型數據集市。對於某些團體而言,某一週的數據不存在。我正在尋找解決這些數據的方法,因此當我開始生成報告時,線圖表示實際數據,0表示確實存在的值。舉例:爲不存在的數據生成0或空值

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

以上例爲例,第三週的數據不存在。我想生成一個查詢,可以爲第3周插入0或空值。當我生成我的報告時,第2周和第4周的數據連接。我需要在第3周插入0或Null。我正在使用SQL Server 2008 R2。

回答

2

您需要結果集才能加入。

您可以生成它在飛行:

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 
0

您可以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 
1

測試數據

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 ║ 
╚═════════╩═════════╩════════════╩═════════════╝