2016-03-22 9 views
1

私は次のような結果を持って(ときレコードなしのギャップを埋める)

Date  | EmployeeID 
2015-11-18 | 1   
2015-11-18 | 1   
2015-11-18 | 1   
2015-11-19 | 1   
2015-11-19 | 1   
2015-11-20 | 1   
2015-11-20 | 1   
2015-11-20 | 1   
2015-11-25 | 1   

しかし、日付の範囲(2015年11月15日 - 2015年11月30日)を与え、私がしたいです私はデータのみで、テーブルから値を取得することで、私はこのアプローチを使用してきたこの

Date  | NbEmployees 
2015-11-15 | 0 
2015-11-16 | 0 
2015-11-17 | 0 
2015-11-18 | 3 
2015-11-19 | 2 
2015-11-20 | 3 
2015-11-21 | 0 
2015-11-22 | 0 
2015-11-23 | 0 
2015-11-24 | 0 
2015-11-25 | 1 
2015-11-26 | 0 
2015-11-27 | 0 
2015-11-28 | 0 
2015-11-29 | 0 
2015-11-30 | 0 

のような表示に何か

DECLARE @StartDate DATE = '2015-11-15 00:00:00', @EndDate DATE = '2015-11-30 23:59:00' 
DECLARE @CurrentDate DATE = @StartDate 
DECLARE @DateRange TABLE (CurrentDate DATETIME) 

WHILE(@CurrentDate <= @EndDate) 
BEGIN 
    INSERT INTO @DateRange VALUES(@CurrentDate) 
    SET @CurrentDate = DATEADD(DAY, 1, @CurrentDate) 
END 

SELECT r.CurrentDate, COUNT(EmployeeID) 
FROM Employee e 
RIGHT JOIN @DateRange r ON e.HireDate = r.Date 

結果:

Date  | NbEmployees 
2015-11-18 | 3 
2015-11-19 | 2 
2015-11-20 | 3 
2015-11-25 | 1 
+1

通常、最も簡単な方法は、カレンダーテーブル(1日に1行)を作成し、それをあなたのクエリと結合することです。 –

+0

それは私がやったことです。私のサンプルコードを見てください。私のカレンダーは@DateRangeです –

+0

どのバージョンのSQL Serverですか? – Shnugo

答えて

1

このようなもので、この

DECLARE @tbl TABLE([Date] DATE, EmployeeID INT); 
INSERT INTO @tbl VALUES 
('2015-11-18',1)   
,('2015-11-18',1)   
,('2015-11-18',1)   
,('2015-11-19',1)   
,('2015-11-19',1)   
,('2015-11-20',1)   
,('2015-11-20',1)   
,('2015-11-20',1)   
,('2015-11-25',1); 

DECLARE @StartDate DATE = '2015-11-15 00:00:00', @EndDate DATE = '2015-11-30 23:59:00' 
DECLARE @CurrentDate DATE = @StartDate 
DECLARE @DateRange TABLE (CurrentDate DATETIME) 

WHILE(@CurrentDate <= @EndDate) 
BEGIN 
    INSERT INTO @DateRange VALUES(@CurrentDate) 
    SET @CurrentDate = DATEADD(DAY, 1, @CurrentDate) 
END 

SELECT CurrentDate,ISNULL(NbEmployees,0) AS NbEmployees 
FROM @DateRange 
LEFT JOIN 
(
    SELECT COUNT(tbl.EmployeeID) AS NbEmployees 
      ,tbl.[Date] AS Date 
    FROM @tbl AS tbl  
    GROUP BY tbl.[Date] 
) AS grouped ON CurrentDate=grouped.[Date] 

結果

2015-11-15 00:00:00.000 0 
2015-11-16 00:00:00.000 0 
2015-11-17 00:00:00.000 0 
2015-11-18 00:00:00.000 3 
2015-11-19 00:00:00.000 2 
2015-11-20 00:00:00.000 3 
2015-11-21 00:00:00.000 0 
2015-11-22 00:00:00.000 0 
2015-11-23 00:00:00.000 0 
2015-11-24 00:00:00.000 0 
2015-11-25 00:00:00.000 1 
2015-11-26 00:00:00.000 0 
2015-11-27 00:00:00.000 0 
2015-11-28 00:00:00.000 0 
2015-11-29 00:00:00.000 0 
2015-11-30 00:00:00.000 0 

ようにそれを試してみてください、あなたは(その場で避けるループをあなたの日付集計を作成することができます!

DECLARE @StartDate DATE = '2015-11-15 00:00:00', @EndDate DATE = '2015-11-30 23:59:00'; 
WITH DayCount(Nmbr) AS 
(
    SELECT TOP (DATEDIFF(DAY,@StartDate,@EndDate)+1) ROW_NUMBER() OVER(ORDER BY (SELECT NULL))-1 FROM sys.objects 
) 
,RunningDates(CurrentDate) AS 
(
    SELECT DATEADD(DAY,Nmbr,@StartDate) FROM DayCount 
) 
SELECT * FROM RunningDates 

これはsys.objectsの最大数にバインドされている...あなたはその場で数字を実行している作成する方法の例をたくさん見つけることができますまたは日付集計表を作成する方法(例えば、この:https://stackoverflow.com/a/32474751/5089204

+0

ルーピングの代わりに、これは集計/数値表でよりうまくいくでしょう。 –

+0

@SeanLange、私は知っている:-)私はちょうど元のコードを取ってそれを変更しました。現時点では、私は飛行中にこれを作成するための小さな例を書いています... – Shnugo

0

list_of_datesテーブルを作成して管理する必要はありません。

のSQLServerのために:あなたはこのような何かに参加outterでき

SELECT 
    DATEADD(DAY,number,'20010101') [Date] 
FROM 
    master..spt_values 
WHERE 
    type = 'P' 
    AND DATEADD(DAY,number,'20010101') <= '20010104' 

またはOracleのため、この:

select 
    rownum - 1 + to_date('01-JAN-2001', 'dd-mon-yyyy') dates 
from 
    all_objects 
where 
    rownum < to_date('01-FEB-2001', 'dd-mon-yyyy') - to_date('01-JAN-2001', 'dd-mon-yyyy') + 2 

このクエリからの出力は次のようになります。

DATES  
--------- 
01-JAN-01 
02-JAN-01 
03-JAN-01 
04-JAN-01 
05-JAN-01 
06-JAN-01 
07-JAN-01 
08-JAN-01 
09-JAN-01 
10-JAN-01 
11-JAN-01 
12-JAN-01 
13-JAN-01 
14-JAN-01 
15-JAN-01 
16-JAN-01 
17-JAN-01 
18-JAN-01 
19-JAN-01 
20-JAN-01 
21-JAN-01 
22-JAN-01 
23-JAN-01 
24-JAN-01 
25-JAN-01 
26-JAN-01 
27-JAN-01 
28-JAN-01 
29-JAN-01 
30-JAN-01 
31-JAN-01 
01-FEB-01 
関連する問題