SQL을 작성하고 싶은데요..
* 아래 표처럼 가로해도 상관없고 세로로 나타내도 상관없습니다~
쉽게 쿼리 작성하는 방법 좀 부탁드려요!!
문제는
하루에 한번씩 이벤트를 지원이 가능한데
각 사용자가 25일에 1회, 26일에 1회, 27일에 1회...
이렇게 1일 1회 이벤트 지원이 가능합니다. 그래서 25일 경우는 1회만 있고 26일 경우에는 25일에 지원 했던사람이 또 지원해서 2회에 대한 데이터가 있습니다. 이런 식으로 29일에는 25~29일까지 연속으로 5회 응시한사람이 있기에 1명이 있습니다.
아래처럼 SQL로 25~ 29일까지 나오게 하고 싶은데 어떻게하면 좋을까요?
* 아래 표처럼 가로해도 상관없고 세로로 나타내도 상관없습니다~
날짜 | 1회 | 2회 | 3회 | 4회 | 5회 |
2020-03-25 | 5명 | ||||
2020-03-26 | 5명 | 2명 | |||
2020-03-27 | 6명 | 4명 | 3명 | ||
2020-03-28 | 10명 | 5명 | 2명 | 5명 | |
2020-03-29 | 11명 | 3명 | 5명 | 4명 | 1명 |
데이터 (날짜별로 하루에 한번 응시 가능) | |
날짜 | 회원번호 |
2020-03-25 | A |
2020-03-25 | B |
2020-03-25 | C |
2020-03-26 | A |
2020-03-26 | B |
2020-03-26 | C |
2020-03-26 | D |
2020-03-26 | E |
2020-03-27 | B |
2020-03-27 | A |
2020-03-27 | C |
Comment 3
-
루디먼트
2020.04.02 10:30
drop table if exists dbo.tSample;create table dbo.tSample( cDate date not null, cCust int not null);goalter table dbo.tSampleadd constraint pk_tSample_01primary key( cCust, cDate);go-- cCnt: 5가 나올 때 까지 반복truncate table dbo.tSample;;with cteSample(cIdx, cTop) as (select 0, 5 union allselect 1, 3 union allselect 2, 6 union allselect 3, 10 union allselect 4, 11)insert into dbo.tSampleselect dateadd(day, cIdx, '2020-01-01'), 10000 + b.cCustfrom cteSample as across apply (select top (cTop + 5)abs(checksum(newid())) % 20 + 1 as cCustfrom master..spt_values) as bgroup by cIdx, b.cCustgoselect cCust, count(*) as cCntfrom dbo.tSamplegroup by cCustorder by cCnt desc;-- cCnt: 5가 나올 때 까지 반복goset statistics io, time on;;with cteSummary as (select cDate, count(*) as cTotalfrom dbo.tSamplegroup by cDate), cteSubTotal as (select a.cDate, a.cTotal, b.cStampfrom cteSummary as aouter apply (select count(*) as cStampfrom dbo.tSamplewhere cDate <= a.cDategroup by cCust-- having count(*) > 1) as b)select cDate, max(cTotal) as cTotal, count(case cStamp when 1 then 1 end) as [1 Time], count(case cStamp when 2 then 1 end) as [2 Time], count(case cStamp when 3 then 1 end) as [3 Time], count(case cStamp when 4 then 1 end) as [4 Time], count(case cStamp when 5 then 1 end) as [5 Time]from cteSubTotalgroup by cDate;go -
훼이커
2020.04.02 16:26
이걸로는 너무 어렵네요 ㅜ ㅜ
혹시 다른 방법도 있을까요?
쿼리 수준이 약해서 ㅜ ㅜ -
지니~~
2020.04.03 11:33
SELECT *FROM (SELECT DISTINCT REGDTFROM #TMP_EVENTGROUP BY REGDT) A OUTER APPLY (SELECT SUM(CASE WHEN EVENT_CNT = 1 THEN 1 ELSE 0 END) AS CNT1, SUM(CASE WHEN EVENT_CNT = 2 THEN 1 ELSE 0 END) AS CNT2, SUM(CASE WHEN EVENT_CNT = 3 THEN 1 ELSE 0 END) AS CNT3, SUM(CASE WHEN EVENT_CNT = 4 THEN 1 ELSE 0 END) AS CNT4, SUM(CASE WHEN EVENT_CNT = 5 THEN 1 ELSE 0 END) AS CNT5FROM (SELECT USERNO, COUNT(*) AS EVENT_CNTFROM #TMP_EVENTWHERE REGDT <= A.REGDTGROUP BY USERNO) A) B