2011-08-06 12 views
5

मेरे पास एक सारणी है जिसमें कई दिनांक फ़ील्ड हैं। उदाहरण के लिए, दोष तालिका में, मेरे पास निम्न है: दिनांक असाइन किया गया, दिनांक पूर्ण, दिनांक संशोधित। मैं एक प्रश्न है कि इस तरह के रूप में दोष का सारांश दिया पाने के लिए कोशिश कर रहा हूँ: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) 

यह काम करता है सही ढंग से तिथि असंबद्ध दोष, लेकिन दूसरों के लिए नहीं। मुझे एहसास है कि यह शायद इस तथ्य के कारण है कि मैं तिथि से समूहबद्ध हूं, लेकिन मुझे नहीं पता कि यह और कैसे करना है।

किसी भी मदद की सराहना की जाएगी।

+0

मैं एक सुंदर तरीका नहीं दिख रहा है, लेकिन आप तीन अलग-अलग उप-चयनों को एक साथ जोड़ सकते हैं, जो बदले में प्रत्येक के लिए समूहित होते हैं। उम्मीद है कि कोई बेहतर कुछ पोस्ट करेगा। –

उत्तर

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 और टाइप

कौन इस

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 

तब मैं SUM(CASE... इस्तेमाल किया डेटा पिवट करने के लिए की तरह दिखाई देगा पैदा करता है। आप इस्तेमाल कर सकते हैं आप एक RDBMS है कि यह समर्थन करता है उपयोग कर रहे हैं pivot बजाय

अंतिम आउटपुट इस

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

तरह दिखता है मैं वर्ष और माह

के स्वरूपण करने के लिए आप के लिए यह छोड़ देंगे
+0

यह चाल है! धन्यवाद एक गुच्छा .... मुझे सीखने के लिए बहुत कुछ है। – j0nnyf1ve

0

एक और तरीका है क्षेत्रों के साथ एक मेज months बनाने के लिए होगा: year, month, firstDate, nextMonthFirstDate, या तो मक्खी पर या एक अस्थायी तालिका के रूप में या स्थायी तालिका के रूप में (100 साल और 100x12 पंक्तियों के साथ संग्रहीत एक मेज होने अधिक स्थान नहीं ले जाएगा और हो सकता है अन्य प्रश्नों में आसान) और इस तरह कुछ उपयोग करें (जोके बराबर हैLEFT JOIN एड तालिका 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

यह संभव है अगर हम मामले में समूह का उपयोग उपनाम

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 
संबंधित मुद्दे