2014-01-14 3 views
0

차고에서, 차고에서 또는 유지 보수를 위해 더 가벼운 버스를 나타내는 데이터 테이블이 포함 된 버스 차고 응용 프로그램이 있다고 가정 해보십시오. 그것은 다음과 같습니다레코드 상태 기록 얻기 SQL Server 2008

+-----------------------+-----+-----+ 
|Date     |BusId|State| 
+-----------------------+-----+-----+ 
|2013-09-12 15:02:41,844|1 |IN | 
+-----------------------+-----+-----+ 
|2013-09-12 15:02:41,844|2 |IN | 
+-----------------------+-----+-----+ 
|2013-09-12 15:02:41,844|3 |OUT | 
+-----------------------+-----+-----+ 
|2013-09-12 15:02:41,844|4 |OUT | 
+-----------------------+-----+-----+ 
|2013-09-12 15:02:41,844|5 |OUT | 
+-----------------------+-----+-----+ 
|2013-09-13 15:02:41,844|1 |OUT | 
+-----------------------+-----+-----+ 
|2013-09-14 15:02:41,844|1 |IN | 
+-----------------------+-----+-----+ 
|2013-09-15 15:02:41,844|1 |OUT | 
+-----------------------+-----+-----+ 
|2013-09-15 15:02:41,844|2 |OUT | 
+-----------------------+-----+-----+ 

지금 내가 어디 차고에서 나에게 얼마나 많은 버스의 개요를 제공하는 좋은 매일 매일 데이터 세트 (또는 시간 시간 등으로)를 만들고 싶어 곳을한다는 얼마나 많은 그것의.

+-------------------+-----+------------+ 
|Date    |State|Count(buses)| 
+-------------------+-----+------------+ 
|2013-09-12 16:00:00|IN |2   | 
+-------------------+-----+------------+ 
|2013-09-12 16:00:00|OUT |3   | 
+-------------------+-----+------------+ 
|2013-09-13 16:00:00|IN |1   | 
+-------------------+-----+------------+ 
|2013-09-13 16:00:00|OUT |4   | 
+-------------------+-----+------------+ 
|2013-09-14 16:00:00|IN |2   | 
+-------------------+-----+------------+ 
|2013-09-14 16:00:00|OUT |3   | 
+-------------------+-----+------------+ 
|2013-09-15 16:00:00|IN |0   | 
+-------------------+-----+------------+ 
|2013-09-15 16:00:00|OUT |5   | 
+-------------------+-----+------------+ 

어떻게하면 TSQL을 사용하여이 작업을 수행 할 수 있습니까? 나는 하나의 reqirement를 가지고 있는데, 그것은 내가 View로서 이것을 가질 것이기 때문에 나는 내 선언문에서 변수 선언을 사용할 수 없다는 것이다.

나는 매우 similar question에게 물었다. 그러나 나는 그 사람이 너무 모르게 말하자면이 사람만큼 일반 적이라고 느꼈다.

+1

뭔가 : 선택한 날짜, 국가는, 일 (일)에 의해 테이블 ​​그룹에서 COUNT (*)가', 그 쿼리는 두 가지를 벗어났습니다 – Melon

+0

을 state' : 그것은 것 날짜가 변하지 않는 상태의 버스와 아무리 특별한 날에 상태를 변경하지 않은 버스도 고려하지 않은 날짜를 알려주십시오. 원하는 결과 집합을 다시보십시오. – Fontanka16

+0

그것은 단지 암시였습니다. (저것은 여기에 있고 응답이 아닙니다.) – Melon

답변

2

여러 상태를 표시하기 위해 하루에 여러 레코드를 기록하고 싶습니까? 나는 그들을 열로 만들 것이다. 당신은 일 /시 그룹별로 계산하는 CTE와 OVER 절을 사용할 수 있습니다 :

WITH CTE AS 
(
    SELECT [Date] = DATEADD(day, DATEDIFF(day, 0, [Date]),0), 
      [BusId], [State], 
      [IN] = SUM(CASE WHEN State='IN' THEN 1 END) OVER (PARTITION BY DATEADD(day, DATEDIFF(day, 0, [Date]),0)), 
      [Out] = SUM(CASE WHEN State='Out' THEN 1 END) OVER (PARTITION BY DATEADD(day, DATEDIFF(day, 0, [Date]),0)), 
      [DayNum] = ROW_NUMBER() OVER (PARTITION BY DATEADD(day, DATEDIFF(day, 0, [Date]),0) 
             ORDER BY [Date], [BusID], [State]) 
    FROM dbo.Garage g  
) 
SELECT [Date], [BusId], [State], [IN], [OUT] 
FROM CTE 
WHERE [DayNum] = 1 

Demo

결과 :

DATE        BUSID STATE IN OUT 
September, 12 2013 00:00:00+0000 1  IN  2 3 
September, 13 2013 00:00:00+0000 1  OUT (null) 1 
September, 14 2013 00:00:00+0000 1  IN  1 (null) 
September, 15 2013 00:00:00+0000 1  OUT (null) 2 

이도 SQL-Server 2005의 경우, 작동 하루 대신에 시간 단위로 그룹화하려면 DATEADD(day, DATEDIFF(day, 0, [Date]),0)DATEADD(hour, DATEDIFF(hour, 0, [Date]),0)으로 변경해야합니다.

+0

내가 원하는 최종 결과는 그와 같은 표입니다. 그러나 핵심 문제 (내 opinoin에서)에 대한 질문을 단순화하려고했습니다. 그러나 대답은 한 가지를 그리워합니다. 차고에 속한 모든 버스의 상태를 요약 해 보겠습니다. 따라서 9 월에 계산 한 수는 4,1이 아니며 1 – Fontanka16

+0

@ Fontanka16 : 왜 4,1인지 분명하지 않습니다. 하지만 하루에 모든 인 아웃의 수를 얻기 위해'[Total] = COUNT (*) OVER (DATEADD (DATEEDD, DATEDIFF (day, 0, [Date])) 파티션을 사용할 수도 있습니다. 논리를 적절하게 변경하십시오. 'BusId'를 포함 시키려면 여러 열로 분할 할 수 있습니다. –

+0

4,1 당일 상태 테이블 1 버스 상태가 바뀌 었습니다. 그 결과 4 개의 버스가 나갔고 1 개는 차고에 있습니다. – Fontanka16

0

이 시도는 .... 같은

DECLARE @businfo AS TABLE([date] datetime,busid int,[state] varchar(5)) 

INSERT INTO @businfo VALUES('2013-09-12 15:02:41',1,'IN') 
INSERT INTO @businfo VALUES('2013-09-12 15:02:41',2,'IN') 
INSERT INTO @businfo VALUES('2013-09-12 15:02:41',3,'OUT') 
INSERT INTO @businfo VALUES('2013-09-12 15:02:41',4,'OUT') 
INSERT INTO @businfo VALUES('2013-09-12 15:02:41',5,'OUT') 
INSERT INTO @businfo VALUES('2013-09-13 15:02:41',1,'OUT') 
INSERT INTO @businfo VALUES('2013-09-14 15:02:41',1,'IN') 
INSERT INTO @businfo VALUES('2013-09-15 15:02:41',1,'OUT') 
INSERT INTO @businfo VALUES('2013-09-15 15:02:41',2,'OUT') 


select [date],[state],COUNT(busid) as [count(buses)] from @businfo 
group by [date],[state] 
order by [date]