2015-01-08 2 views
1

하나의 테이블에서 데이터에 대해 두 개의 개별 열을 얻으려고합니다.동일한 그룹으로 2 열 계산

문제점을 추적하는 데이터베이스가 있으며 문제 표에는 각각 날짜가 포함 된 2 개의 관련 열이 있습니다. 다음과 매우 유사합니다.

DateOpened DateClosed 
2015-01-08 2015-01-08 
2015-01-08 2015-01-08 
2015-01-06 2015-01-08 
2015-01-06 2015-01-08 
2015-01-04 2015-01-07 
2015-01-02 2015-01-07 
2015-01-02 2015-01-07 

나의 목표는 각 날짜에 열거 나 닫히는 항목의 수를 계산할 수있게하는 것입니다. 위에서 예상되는 출력의 예가 다음과 같습니다.

Date   CountDateOpened CountDateClosed 
2015-01-08 2    4 
2015-01-07 0    3 
2015-01-06 2    0 
2015-01-05 0    0 
2015-01-04 1    0 
2015-01-03 0    0 
2015-01-02 2    0 

은 내가 날짜로 그룹에 필요로 알고 있지만 더 문제가 열려보다 닫힌 일이 있어야한다,하지만 내 COUNT (DateClosed는) 결코 내 카운트 (DateOpened)를 초과 할 것 같다. 나는 쿼리의 파리 날짜 변환을하고 있지만, 나는 항상 가장 가까운 날짜로 돌리기 때문에 관련성이 있다고 생각하지 않는다. 다음은 지금까지 실행중인 쿼리입니다. 단순성을 위해 스킨을 사용했습니다.

SELECT 
    CREATEDATE AS [Date], 
    COUNT(CREATEDATE) AS [Number Opened], 
    COUNT(CLOSEDATE) AS [Number Closed] 

FROM 
    ISSUE 

GROUP BY 
    CREATEDATE 

ORDER BY 
    [Date] DESC 

답변

3

이 일을하는 한 가지 방법은 그룹의 종류에 따라 다음 날짜 및 모두를위한 하나의 열을 만들 union all을 사용하는 것입니다

SELECT `Date`, 
     COUNT(`open`) AS `CountDateOpened` 
     COUNT(`closed`) AS `CountDateClosed` 
FROM  (SELECT `DateOpened` AS `Date`, 1 AS `open`, NULL AS `closed` 
      FROM `issue` 
      UNION ALL 
      SELECT `DateClosed` AS `Date`, NULL AS `open`, 1 AS `closed` 
      FROM `issue` 
     ) t 
GROUP BY `Date` 
ORDER BY `Date` DESC 
+0

좋은 솔루션입니다. "ORDER BY date DESC"가 필요합니다. – twyly

+0

@twylyc는 OP 쿼리에서 'order by'를 놓쳤습니다 - 편집하고 추가했습니다. 그것을 지적 주셔서 감사합니다! – Mureinik

+1

테이블에 존재하지 않는 '2015-01-05'및 '2015-01-03'이 출력에 포함되지 않습니다. 이것은 매우 번거롭고 테이블 –

1

select 
d.dt,(select COUNT(DateOpened) ct from ISSUE where 
CAST(DateOpened as DATE)=CAST(d.dt as DATE)) 
,(select COUNT(DateClosed) ct from ISSUE where 
CAST(DateClosed as DATE)=CAST(d.dt as DATE)) 
from (
select number,DATEADD(D,number-7,GETDATE()) dt 
from master.dbo.spt_values sp 
where type='P' and DATEADD(D,number-7,GETDATE())<'2015-01-09' 
) 
d 
ORDER BY d.dt desc 

OUTPUT 시도

Date  DateOpened DateClosed 
2015-01-08 2   4 
2015-01-07 0   3 
2015-01-06 2   0 
2015-01-05 0   0 
2015-01-04 1   0 
2015-01-03 0   0 
2015-01-02 2   0 
Mureinik의 대답은 조금 덜 입력과 동일
+0

에 없습니다. 노동 조합 아이디어를보십시오. – Strawberry

+0

@Strawberry yes ...하지만 그는 '2015-01-05'와'2015-01-03'을 놓치지 않는 숫자 표를 사용해야합니다. –

0

...

SELECT date,SUM(status='opened') opened, SUM(status = 'closed') closed 
    FROM 
    (SELECT dateopened date,'opened' status FROM my_table 
     UNION ALL 
     SELECT dateclosed,'closed' FROM my_table 
    ) x 
GROUP 
    BY date DESC;