2015-10-15 19 views
-1

我在SQL Server中兩個表:SQL服務器填充空值或不存在的值

表一

Weeknumber Dept   
    1  Sales 
    1  Sales 
    1  Sales 
    2  Transport 
    3  Call centre 
    4  Sales 
    5  Personel 
    6  Marketing  
    9  HR 
    9  HR 
    10  Purchases 

表二

Weeknumber 
    1 
    2 
    3 
    4 
    5 
    6 
    7 
    8 
    9 
    10 

我想編寫一個查詢計算部門的數量,如果部門不在表中,則它應該返回0.

對於上面的示例TABLE一。第7和第8部分不見了,但我想將它包含在我的最終結果中,看起來像下面的表格顯示。

任何幫助,請

table sample here

Weeknumber Count_OF_Dept 
    1   3 
    2   1 
    3   1 
    4   1 
    5   1 
    6   1 
    7   0 
    8   0 
    9   2 
    10   1 
+0

請查看圖片以獲取問題的表格示例 – JonWay

+2

請分享查詢/代碼/無論您試圖實現您的目標。請求代碼沒有顯示任何努力解決您的問題是爲自由職業者的網站,而不是一個問答網站。 – Pred

+0

嗨JonWay,因爲你是新來的SO,請注意,專業人士在這裏給出答案,渴望聲望點。如果有幫助,請通過答案並投票。如果其中一位幫助你解決了你的問題,你應該將它標記爲已接受的答案,Thx! – Shnugo

回答

2

你只需要使用子查詢與COUNT

SELECT t2.Weeknumber, 
     Count_OF_Dept = (SELECT COUNT(*) FROM TableOne t1 
         WHERE t1.Weeknumber = t2.Weeknumber) 
FROM TableTwo t2 

你的樣品:http://sqlfiddle.com/#!6/ab62b/1/0

+0

如果系統中的週數較少,這是正確的答案。我想,在這一點上我誤解了這個問題。一票從我身邊投票... – Shnugo

1

試試這樣。只需將其粘貼到一個空的查詢窗口並執行。

注意:有一個非常漂亮的函數來創建一組正在運行的數字,這些數字將在開始時創建並在最後刪除。如果你確定,只能刪除它,在你的數據庫中沒有這個名字的函數!

如果你不想創建一個新的功能,只需告訴我,我會幫你用一個「實時」解決方案通過CTE替換它。

CREATE FUNCTION [dbo].[RunningNumbers](@counter INT=1000000, @StartAt INT=0) 
RETURNS TABLE 
AS 
RETURN 
    WITH E1(N) AS(SELECT 1 FROM(VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))t(N)), --10^1 
    E2(N) AS(SELECT 1 FROM E1 a CROSS JOIN E1 b), -- 10^2 = 100 rows 
    E4(N) AS(SELECT 1 FROM E2 a CROSS JOIN E2 b), -- 10^4 = 10,000 rows 
    E8(N) AS(SELECT 1 FROM E4 a CROSS JOIN E4 b), -- 10^8 = 10,000,000 rows 
    CteTally AS 
    (
     SELECT TOP(ISNULL(@counter,1000000)) ROW_NUMBER() OVER(ORDER BY(SELECT NULL)) -1 + ISNULL(@StartAt,0) As Nmbr 
     FROM E8 
    ) 
    SELECT * FROM CteTally; 

GO 

DECLARE @tbl TABLE(WeekNumber INT,Dept VARCHAR(100)); 
INSERT INTO @tbl VALUES 
(1,'Sales') 
,(1,'Sales') 
,(1,'Sales') 
,(2,'Transport') 
,(3,'Call centre') 
,(4,'Sales') 
,(5,'Personel') 
,(6,'Marketing') 
,(9,'HR') 
,(9,'HR') 
,(10,'Purchases'); 

SELECT weekNmbrs.Nmbr 
     ,Tbl.WeekNumber 
     ,COUNT(Tbl.Dept) 
FROM dbo.RunningNumbers(10,1) AS weekNmbrs 
LEFT JOIN @tbl AS Tbl ON weekNmbrs.Nmbr=Tbl.WeekNumber 
GROUP BY weekNmbrs.Nmbr, Tbl.WeekNumber 
ORDER BY weekNmbrs.Nmbr ; 

--Clean up 
/* Are you sure? 
DROP FUNCTION dbo.RunningNumbers; 
*/