試試這樣。只需將其粘貼到一個空的查詢窗口並執行。
注意:有一個非常漂亮的函數來創建一組正在運行的數字,這些數字將在開始時創建並在最後刪除。如果你確定,只能刪除它,在你的數據庫中沒有這個名字的函數!
如果你不想創建一個新的功能,只需告訴我,我會幫你用一個「實時」解決方案通過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;
*/
請查看圖片以獲取問題的表格示例 – JonWay
請分享查詢/代碼/無論您試圖實現您的目標。請求代碼沒有顯示任何努力解決您的問題是爲自由職業者的網站,而不是一個問答網站。 – Pred
嗨JonWay,因爲你是新來的SO,請注意,專業人士在這裏給出答案,渴望聲望點。如果有幫助,請通過答案並投票。如果其中一位幫助你解決了你的問題,你應該將它標記爲已接受的答案,Thx! – Shnugo