2015-08-26 4 views
5

मुझे वर्तमान में मेरी तालिका से सही मान प्राप्त करने में कठिनाई हो रही है। यहाँ मेरी मेजएक तालिका से SQL कॉलम समूहित करना

नोट है: स्तंभ Status 3 संभावित मान (साफ़ किया, अशुद्ध, बंद)

+-----------+-------------+--------+------------+ 
    |ApplicantID|ApplicantName| Status | HireDate | 
    +-----------+-------------+--------+------------+ 
    |  1  | John Smith |Cleaned |08/26/2015 | 
    |  2  | Alex Murphy |Closed |09/12/2015 | 
    |  3  | Oliver David|Cleaned |01/11/2015 | 
    |  4  | Max Payne |Unclean |03/18/2015 | 
    +-----------+-------------+--------+------------+ 

उत्पादन मैं उम्मीद कर रहा हूँ है और यह भी वर्ष के अनुसार क्रमबद्ध किया जाना चाहिए। उदाहरण के लिए मैं इन सभी रिकॉर्ड को वर्ष 2015 के लिए कॉल करता हूं जो मुझे परिवर्तनीय @Year का उपयोग कर मिलता है।

नोट: स्तंभ Total, Cleaned का योग और Unclean

+---------+-----------+-----------+----------+---------+ 
    | Month | Cleaned | Unclean | Closed | Total | 
    +---------+-----------+-----------+----------+---------+ 
    | January|  1  |  0  | 0  | 1 | 
    | February|  0  |  0  | 0  | 0 | 
    | March |  0  |  1  | 0  | 1 | 
    | April |  0  |  0  | 0  | 0 | 
    | May |  0  |  0  | 0  | 0 | 
    | June |  0  |  0  | 0  | 0 | 
    | July |  0  |  0  | 0  | 0 | 
    | August |  1  |  0  | 0  | 1 | 
    |September|  0  |  0  | 1  | 0 | 
    | October|  0  |  0  | 0  | 0 | 
    | November|  0  |  0  | 0  | 0 | 
    | December|  0  |  0  | 0  | 0 | 
    +---------+-----------+-----------+----------+---------+ 

मैं सही कोड प्राप्त नहीं कर पा रहे है एसक्यूएल के लिए इसे मेरा वर्तमान कोड है।

SELECT Month(HireDate) AS Month, COUNT(*) 
FROM Hires 
GROUP BY Month(HireDate) 

मुझे पता है कि मेरा कोडिंग गलत है, क्योंकि यह अपूर्ण है।

उत्तर

3

1 से 12 से पहले month एस को पकड़ने के लिए पहले संख्याओं की एक सूची उत्पन्न करें। फिर पर Hires पर यह सुनिश्चित करने के लिए कि सभी गुम महीनों के लिए जिम्मेदार है। तो योग के लिए सशर्त एकत्रीकरण का उपयोग करें:

SQL Fiddle

;WITH CteMonths AS(
    SELECT * FROM(VALUES 
     (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12) 
    )t(N) 
) 
SELECT 
    Month = DATENAME(MONTH, DATEADD(MONTH, N-1,0)), 
    Cleaned = SUM(CASE WHEN h.Status = 'Cleaned' THEN 1 ELSE 0 END), 
    Closed = SUM(CASE WHEN h.Status = 'Closed' THEN 1 ELSE 0 END), 
    Unclean = SUM(CASE WHEN h.Status = 'Unclean' THEN 1 ELSE 0 END), 
    Total = SUM(CASE WHEN h.Status IN('Cleaned', 'Unclean') THEN 1 ELSE 0 END) 
FROM CteMonths m 
LEFT JOIN Hires h 
    ON m.N = MONTH(h.HireDate) 
    --AND YEAR(h.HireDate) = @year --uncomment this line to filter for year. 
GROUP BY m.N 
ORDER BY m.N 

आप वर्ष शामिल करना चाहते हैं:

SQL Fiddle

;WITH CteMonths AS(
    SELECT * FROM(VALUES 
     (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12) 
    )t(N) 
), 
CteYears(yr) AS(
    SELECT DISTINCT YEAR(HireDate) FROM Hires 
), 
CteAllDates(dt) AS(
    SELECT 
     DATEADD(MONTH, m.N - 1, DATEADD(YEAR, y.yr - 1900, 0)) 
    FROM CteMonths m 
    CROSS JOIN CteYears y 
) 
SELECT 
    Year = YEAR(d.dt), 
    Month = DATENAME(MONTH, d.dt), 
    Cleaned = SUM(CASE WHEN h.Status = 'Cleaned' THEN 1 ELSE 0 END), 
    Closed = SUM(CASE WHEN h.Status = 'Closed' THEN 1 ELSE 0 END), 
    Unclean = SUM(CASE WHEN h.Status = 'Unclean' THEN 1 ELSE 0 END), 
    Total = SUM(CASE WHEN h.Status IN('Cleaned', 'Unclean') THEN 1 ELSE 0 END) 
FROM CteAllDates d 
LEFT JOIN Hires h 
    ON MONTH(d.dt) = MONTH(h.HireDate) 
    AND YEAR(d.dt) = YEAR(h.HireDate) 
GROUP BY YEAR(d.dt), MONTH(d.dt), DATENAME(MONTH, d.dt) 
ORDER BY YEAR(d.dt), MONTH(d.dt) 

आप वर्ष के लिए फ़िल्टर करना चाहते हैं , @year = 2015 कहें, आप टी को प्रतिस्थापित कर सकते हैं वह साथ पिछले सीटीई:

;WITH CteMonths AS(
    SELECT * FROM(VALUES 
     (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12) 
    )t(N) 
), 
CteAllDates(dt) AS(
    SELECT 
     DATEADD(MONTH, m.N - 1, DATEADD(YEAR, @year - 1900, 0)) 
    FROM CteMonths m 
)... 
+0

हां, 'SUM' कुल के कारण। –

+2

एक मिनट रुको ... आप @wewesthemenace का नाम बदला गया है! मुझे नहीं पता था इसलिए आप उपयोगकर्ता नाम बदल सकते हैं। –

+0

@TimBiegeleisen Yup, यह मैं हूं। –

0

मैं 112 को (महीनों की संख्या) और JOINTEMP तालिका के साथ अपनी मेज से मूल्यों के साथ TEMP तालिका बनाने के लिए सुझाव देते हैं। कॉलम नामों के रूप में मान प्राप्त करने के लिए आप PIVOT या CASE का उपयोग कर सकते हैं। आप निम्न में यह कर सकते हैं:

INSERT INTO #Months VALUES 
(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12) 

SELECT DATENAME(MONTH, DATEADD(MONTH, m.Id-1, 0)) AS [Month] 
     , SUM(CASE WHEN [Status] = 'Cleaned' THEN 1 ELSE 0 END) AS [Cleaned] 
     , SUM(CASE WHEN [Status] = 'Closed' THEN 1 ELSE 0 END) AS [Closed] 
     , SUM(CASE WHEN [Status] = 'Unclean' THEN 1 ELSE 0 END) AS [Unclean] 
     , SUM(CASE WHEN [Status] IN ('Unclean', 'Cleaned') THEN 1 ELSE 0 END) AS [Total] 
FROM #Test t 
RIGHT JOIN #Months m ON m.Id = MONTH(t.HireDate) 
GROUP BY m.Id 

आउटपुट

+---------+-----------+-----------+----------+---------+ 
    | Month | Cleaned | Unclean | Closed | Total | 
    +---------+-----------+-----------+----------+---------+ 
    | January |  1  |  0  | 0  | 1 | 
    | February|  0  |  0  | 0  | 0 | 
    | March |  0  |  1  | 0  | 1 | 
    | April |  0  |  0  | 0  | 0 | 
    | May |  0  |  0  | 0  | 0 | 
    | June |  0  |  0  | 0  | 0 | 
    | July |  0  |  0  | 0  | 0 | 
    | August |  1  |  0  | 0  | 1 | 
    |September|  0  |  0  | 1  | 0 | 
    | October |  0  |  0  | 0  | 0 | 
    | November|  0  |  0  | 0  | 0 | 
    | December|  0  |  0  | 0  | 0 | 
    +---------+-----------+-----------+----------+---------+ 

डेमो

आपको कम से यह परीक्षण कर सकते हैं: SQL FIDDLE

संबंधित मुद्दे