2011-08-06 40 views
5

Tôi có một bảng có nhiều trường ngày tháng. Ví dụ, trong bảng khuyết tật, tôi có những điều sau đây: dateAssigned, dateCompleted, dateResolved. Tôi cố gắng để có được một truy vấn mà tóm tắt những khiếm khuyết như vậy:Truy vấn SQL nhóm nhiều trường ngày

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

vv

tôi đã đưa ra những điều sau đây để avail không có:

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) 

này hoạt động một cách chính xác cho tóm tắt dateAssigned lỗi, nhưng không phải cho những người khác. Tôi nhận ra điều này có lẽ là do thực tế tôi đang nhóm theo dateAssigned, nhưng tôi không biết làm thế nào khác để làm điều đó.

Mọi trợ giúp sẽ được đánh giá cao.

+0

tôi không thấy một cách tao nhã, nhưng bạn có thể liên kết với nhau ba lựa chọn phụ khác nhau, được nhóm lại cho mỗi lần lượt. hy vọng ai đó sẽ đăng nội dung nào đó tốt hơn. –

Trả lời

1

Đây là một cách để thực hiện.

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) 

Tiểu chọn tạo ra hai cột typedate và gõ

Mà sẽ trông như thế này

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 

Sau đó, tôi sử dụng SUM(CASE... xoay quanh dữ liệu. Nếu bạn đang sử dụng một RDBMS có hỗ trợ nó, bạn có thể sử dụng thay vì pivot

Kết quả cuối cùng trông giống như sau

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

Tôi sẽ để lại nó cho bạn để thực hiện định dạng của năm và tháng

+0

Điều này đã làm các trick! Cảm ơn một bó .... Tôi có rất nhiều điều để học. – j0nnyf1ve

0

Một cách khác là tạo một bảng months với các trường: year, month, firstDate, nextMonthFirstDate, hoặc trên bay hoặc dưới dạng bảng tạm thời hoặc bảng vĩnh viễn (có bảng được lưu trữ với 100 năm và 100x12 hàng sẽ không chiếm nhiều không gian và có thể tiện dụng trong các truy vấn khác) và sử dụng một cái gì đó như thế này (tương đương với monthsLEFT JOIN ed ba lần để bảng defect):

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

Điều này có thể nếu chúng ta sử dụng nhóm bởi trong trường hợp bí danh

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 
Các vấn đề liên quan