2016-10-05 2 views
1

다음 구조 (차트를 생성하는 데 사용되는 일부 조인 등)가 있습니다.0으로 SQL 쿼리의 날짜 간격 채우기

일부 ID에는 모든 날짜에 대한 데이터가 없으므로 차트에 점선이 표시됩니다.

질문은 각 ID에 누락 날짜를 추가하고 데이터 셀에 0을 채우려면 어떻게해야합니까? 스크립트로

enter image description here

: 즉

with t as (
     <your query here> 
    ) 
select i.id, rt.roundedtime, coalesce(data, 0) as data 
from (select distinct id from t) i cross join 
    (select distinct roundedtime rt from t) rt left join 
    t 
    on t.id = i.id and t.roundedtime = rt.roundedtime; 

, 날짜와 cross join를 사용 id의 목록을 작성합니다

(67, '2016-09-28 00:00:00.000',1), 
(178, '2016-09-28 00:00:00.000',6), 
(42, '2016-09-25 00:00:00.000',1), 
(66, '2016-09-25 00:00:00.000',122), 
(67, '2016-09-25 00:00:00.000',2), 
(10, '2016-09-24 00:00:00.000',5), 
(13, '2016-09-24 00:00:00.000',4), 
(66, '2016-09-24 00:00:00.000',198), 
(67, '2016-09-24 00:00:00.000',15), 
(178, '2016-09-24 00:00:00.000',4), 
(10, '2016-09-23 00:00:00.000',1), 
(13, '2016-09-23 00:00:00.000',2), 
(42, '2016-09-23 00:00:00.000',4), 
(66, '2016-09-23 00:00:00.000',208), 
(67, '2016-09-23 00:00:00.000',15) 
+1

일종의 일정표를 사용해야한다고 생각합니다. –

+1

[SQL : 사용자 수에 대한 일별 보고서]의 가능한 복제본 (http://stackoverflow.com/questions/39849213/sql-daily-report-for-with-user-counts) – JohnHC

+0

@JohnHC 나는 시각화 할 수 없었습니다. 데이터 구조는 이것이 중복인지 확실하지 않습니다. – espressionist

답변

1

또 하나의 방법에 가입하지 않고 CROSS이 가입하면 Select 문 Data column return 0 위 : 샘플

;WITH YourQueryOutput AS (
--put your select statement here 
), calendar AS (
SELECT CAST(MIN(RoundedTime) as datetime) as d, 
     MAX(RoundedTime) as e 
FROM YourQueryOutput 
UNION ALL 
SELECT DATEADD(day,1,d), 
     e 
FROM calendar 
WHERE d < e 
) 

SELECT t.ID, 
     c.d, 
     COALESCE(t1.[data],0) as [data] 
FROM calendar c 
CROSS JOIN (
    SELECT DISTINCT ID 
    FROM YourQueryOutput 
    ) t 
LEFT JOIN YourQueryOutput t1 
    ON t.ID = t1.ID and t1.RoundedTime = c.d 
ORDER BY t.ID, c.d 
OPTION(MAXRECURSION 0) 

출력 당신이 제공 한 것

ID d      data 
10 2016-09-23 00:00:00.000 1 
10 2016-09-24 00:00:00.000 5 
10 2016-09-25 00:00:00.000 0 
10 2016-09-26 00:00:00.000 0 
10 2016-09-27 00:00:00.000 0 
10 2016-09-28 00:00:00.000 0 
... 
178 2016-09-23 00:00:00.000 0 
178 2016-09-24 00:00:00.000 4 
178 2016-09-25 00:00:00.000 0 
178 2016-09-26 00:00:00.000 0 
178 2016-09-27 00:00:00.000 0 
178 2016-09-28 00:00:00.000 6 
+0

정확히 내가 수행 한 것입니다. 덕분에 많은 것을 !! – espressionist

1

여기 하나의 방법이다. 그런 다음 left join을 사용하여 데이터를 가져 오십시오.

이 쿼리는 원래 데이터에 select distinct을 사용하여 날짜 및 ID 목록을 가져옵니다. 각 목록을 얻는보다 효율적인 방법이있을 수 있습니다.

+0

의견을 보내 주셔서 감사합니다. 문제는 모든 날짜가 나열되지 않아 쿼리에 나타나지 않는다는 것입니다. – espressionist

0

조인을 사용한 SELECT 문에서 ISNULL (YourDataColumn, 0)을 확인할 수 있습니다.

예 :

SELECT 
    Q.QuestionId, 
    Q.SenderType, 
    ISNULL(Q.Data,0) AS Data 
FROM @tblQuestion Q 
LEFT JOIN @tblTeacher T ON Q.SenderId=T.Id AND Q.SENDERTYPE='TEACHER' 
LEFT JOIN @tblInstitute I ON Q.SenderId=I.Id AND Q.SENDERTYPE='INSTITUTE' 

에서 사용할 수있는 데이터 후 일정 테이블과

+0

해당 쿼리에 포함되지 않는 일부 ID가 있으며 OP에서 누락 된 날짜와 0을 표시해야 함을 알고 있습니다. – gofr1

+0

내가 출력 테이블에서 어떤 날짜에 대한 데이터가 없으므로 차트가 적절하게 렌더링되지 않으므로 차트가 int를 받아들이면 데이터가 있어야합니다. 0 데이터 유형별로 다른 값이 있습니다. –

+0

@ gofr1 : 맞습니다. 틈이 있습니다. ID와 RoundedTime을 쿼리에 포함 시키면 ISNULL이 여기서는별로 도움이되지 않습니다. – espressionist