2011-08-06 5 views
5

여러 개의 날짜 필드가있는 테이블이 있습니다. 예를 들어, defect 테이블에는 dateAssigned, dateCompleted, dateResolved 등이 있습니다. 나는 같은 결함을 요약하는 쿼리를 얻기 위해 노력하고 있어요 :여러 날짜 필드를 그룹화하는 SQL 쿼리

  | Number Assigned | Number Completed | Number Resolved 
-----------------------------+------------------+----------------- 
    Mar-2011 |  33   |  22  |  33   
    Apr-2011 |  10   |  11  |  22 
    May-2011 |  22   |  66  |  46 

등 나는 아무 소용이 다음과 같이 올라와있다

다음을 요약 올바르게

SELECT year(d.dateAssigned) 
     ,month(d.dateAssigned) 
     ,COUNT(d.dateAssigned) 
     ,COUNT(d.dateCompleted) 
     ,COUNT(d.dateResolved) 
    FROM defect d 
    GROUP BY year(d.dateAssigned), month(d.dateAssigned) 
    ORDER BY year(d.dateAssigned), month(d.dateAssigned) 

이 작동 dateAssigned 결함은 있지만 다른 결함은 아닙니다. 나는 이것이 아마도 dateAssigned에 의해 그룹화되어 있다는 사실에 기인 한 것임을 알았지 만, 다른 방법을 알지 못합니다.

도움을 주시면 감사하겠습니다.

+0

을 별칭 만 :LEFT JOIN 테이블 defect에 세 번) 에드 당신은 3 개의 서로 다른 하위 선택을 차례대로 조합 할 수 있습니다. 잘하면 누군가가 더 나은 것을 게시 할 것입니다. –

답변

1

이렇게하는 것이 하나의 방법입니다.

SELECT YEAR(typedate), 
     MONTH(typedate), 
     SUM(CASE 
      WHEN TYPE = 'assinged' THEN 1 
      ELSE 0 
      END) number_assigned, 
     SUM(CASE 
      WHEN TYPE = 'completed' THEN 1 
      ELSE 0 
      END) number_completed, 
     SUM(CASE 
      WHEN TYPE = 'Resolved' THEN 1 
      ELSE 0 
      END) number_resolved 
FROM (SELECT dateassigned typedate, 
       'assinged' AS TYPE 
     FROM sampledata 
     WHERE dateassigned IS NOT NULL 
     UNION ALL 
     SELECT datecompleted typedate, 
       'completed' AS TYPE 
     FROM sampledata 
     WHERE datecompleted IS NOT NULL 
     UNION ALL 
     SELECT dateresolved typedate, 
       'Resolved' AS TYPE 
     FROM sampledata 
     WHERE dateresolved IS NOT NULL) data 
GROUP BY YEAR(typedate), 
      MONTH(typedate) 
ORDER BY YEAR(typedate), 
      MONTH(typedate) 

선택 서브 두 열 typedate 및 I 데이터를 피봇 SUM(CASE... 사용이어서이

typedate type 
-------- --------- 
1/1/2011 assinged 
1/1/2011 assinged 
1/1/2011 assinged 
2/1/2011 completed 
2/1/2011 completed 
2/3/2011 Resolved 

모양을

입력을 생성한다. 당신이 그것을 지원하는 RDBMS를 사용하는 경우 당신은 내가 연도와 월

의 서식을 수행 할에 떠날거야 pivot 대신

최종 출력이

     Number_Assigned Number_completed Number_Resolved 
----------- ----------- --------------- ---------------- --------------- 
2011  1   3    0    0 
2011  2   0    2    1 

같이 보입니다 사용할 수 있습니다

+0

이것은 트릭을 했어! 고마워. .... 나는 배울 것이 많다. – j0nnyf1ve

0

또 다른 방법은 필드가 year, month, firstDate, nextMonthFirstDate 인 테이블 months을 즉석에서 또는 임시 테이블 또는 영구 테이블로 생성하는 것입니다 (100 년 및 100x12 행으로 저장된 테이블은 많은 공간을 차지하지 않으며 다른 쿼리에서 사용하기 쉽습니다) 그리고 이와 비슷한 것을 사용하십시오 (이것은와 같습니다). 내가 우아한 방법을 볼 수 없습니다

SELECT 
    (SELECT COUNT(*) 
     FROM defect AS d 
     WHERE m.firstDate <= d.dateAssigned 
     AND d.dateAssigned < m.nextMonthFirstDate 
    ) AS Number_Assigned 
    . (SELECT COUNT(*) 
     FROM defect AS d 
     WHERE m.firstDate <= d.dateCompleted 
     AND d.dateCompleted < m.nextMonthFirstDate 
    ) AS Number_Completed 
    . (SELECT COUNT(*) 
     FROM defect AS d 
     WHERE m.firstDate <= d.dateResolved 
     AND d.dateResolved < m.nextMonthFirstDate 
    ) AS Number_Resolved 
FROM months AS m 
ORDER BY m.year 
     , m.month 
2
SELECT year(defectDate), month(defectDate), SUM(assigned), SUM(resolved), SUM(completed) 
    FROM (
    SELECT d.dateAssigned AS defectDate, 1 AS assigned, 0 AS resolved, 0 AS completed 
     FROM defect d 
    UNION ALL 
    SELECT d.dateCompleted AS defectDate, 0 AS assigned, 1 AS resolved, 0 AS completed 
     FROM defect d 
    UNION ALL 
    SELECT d.dateResolved AS defectDate, 0 AS assigned, 0 AS resolved, 1 AS completed 
     FROM defect d 
) 
    GROUP BY year(defectDate), month(defectDate) 
    ORDER BY year(defectDate), month(defectDate) 
1
SELECT year(d.dateAssigned) 
     ,month(d.dateAssigned) 
     ,COUNT(d.dateAssigned) 
     ,(SELECT count(*) 
     FROM defect as dc 
     WHERE month(dc.dateCompleted) = month(d.dateAssigned) and 
       year(dc.dateCompleted) = year(d.dateAssigned)) 
     ,(SELECT count(*) 
     FROM defect as dr 
     WHERE month(dr.dateResolved) = month(d.dateAssigned) and 
       year(dr.dateResolved) = year(d.dateAssigned)) 
FROM defect d 
GROUP BY year(d.dateAssigned), month(d.dateAssigned) 
-1

우리가 경우에 의해 그룹을 사용하는 경우이 가능가

SELECT CASE 
     WHEN (year(Challan_Date) is null or year(TAX_INVOICE_Date)!=null) THEN year(TAX_INVOICE_Date) 
     WHEN (year(Challan_Date) != null or year(TAX_INVOICE_Date) is null) THEN YEAR(Challan_Date) 
     WHEN (year(Challan_Date) is null or year(TAX_INVOICE_Date)is null) THEN 'NA' 
     WHEN (year(Challan_Date) != null or year(TAX_INVOICE_Date)!= null) THEN year(Challan_Date) 
     ELSE year(TAX_INVOICE_Date) END as Dates_Record, TAX_INVOICE_Date, Challan_Date 
FROM TransactionRecords 
관련 문제