मेरे पास एक टेबल है जो इस तरह दिखता है
ID NAME MODULE STARTDATE ENDDATE MARK
123456 J Bloggs Module 1 13/01/2014 30/04/2014 FAIL
123456 J Bloggs Module 1 13/05/2014 30/08/2014 FAIL
123456 J Bloggs Module 1 13/09/2014 30/12/2014 PASS
123456 J Bloggs Module 2 13/05/2014 30/08/2014 PASS
123456 J Bloggs Module 3 13/01/2015 30/04/2015 FAIL
234567 A Test Module 1 13/01/2014 30/04/2014 PASS
234567 A Test Module 2 13/05/2014 30/08/2014 FAIL
234567 A Test Module 2 13/09/2014 30/12/2014 PASS
तालिका में समान मात्रा में डेटा शामिल हैंइस संरचना में। मैं जो करने की कोशिश कर रहा हूं वह छात्र और मॉड्यूल के आधार पर एक पंक्ति संरचना में कई पंक्तियों के कुछ डेटा को लगभग एक दूसरे से अलग कर रहा है, इसलिए अंतिम परिणाम कुछ इस तरह दिखाई देगा
ID NAME MODULE ENDDATE1 ENDDATE2 ENDDATE3 MARK
123456 J Bloggs Module 1 30/04/2014 30/08/2014 30/12/2014 PASS
123456 J Bloggs Module 2 30/08/2014 PASS
123456 J Bloggs Module 3 30/04/2015 FAIL
234567 A Test Module 1 30/04/2014 PASS
234567 A Test Module 2 30/08/2014 30/12/2014 PASS
इसलिए नई तालिका में सभी अंतिम तिथियां प्रदर्शित होंगीमॉड्यूल के आधार पर एक ही पंक्ति में, और फिर सबसे हालिया चिह्न "अधिकतम (मार्क)" प्रदर्शित किया जाएगा। 3 से अधिक संभावित अंत होने की संभावना है जैसा कि उदाहरण तालिका में प्रदर्शित किया गया है क्योंकि यह पूरी तरह से मूल तालिका पर निर्भर करेगा और एक छात्र को कितनी बार एक मॉड्यूल को "रीसेट" करना पड़ सकता है (4/5 तक हो सकता है) कुछ मामलों में समय)।
उत्तर:
जवाब के लिए 0 № 1डायनामिक पिवट का उपयोग करके देखें:
IF(OBJECT_ID("tempdb..#table") IS NOT NULL)
DROP TABLE #TABLE
CREATE TABLE #TABLE (ID INT, NAME VARCHAR(30),MODULE VARCHAR(30),STARTDATE VARCHAR(30),ENDDATE VARCHAR(30),MARK VARCHAR(30))
INSERT INTO #TABLE VALUES
(123456, "J Bloggs", "Module 1", "13/01/2014", "30/04/2014", "FAIL"),
(123456, "J Bloggs", "Module 1", "13/05/2014", "30/08/2014", "FAIL"),
(123456, "J Bloggs", "Module 1", "13/09/2014", "30/12/2014", "PASS"),
(123456, "J Bloggs", "Module 2", "13/05/2014", "30/08/2014", "PASS"),
(123456, "J Bloggs", "Module 3", "13/01/2015", "30/04/2015", "FAIL"),
(234567, "A Test", "Module 1", "13/01/2014", "30/04/2014", "PASS"),
(234567, "A Test", "Module 2", "13/05/2014", "30/08/2014", "FAIL"),
(234567, "A Test", "Module 2", "13/09/2014", "30/12/2014", "PASS")
DECLARE @Columns VARCHAR(MAX)
SELECT @Columns = STUFF((SELECT "," + "[" + CONVERT(VARCHAR(30), number, 121) + "]"
FROM master..spt_values N
WHERE n.number BETWEEN 1 AND (SELECT TOP 1 COUNT(Enddate)
FROM #TABLE
GROUP BY ID,NAME,MODULE
ORDER BY COUNT(Enddate) DESC)
AND TYPE = "P"
FOR XML PATH("")), 1, 1, "")
DECLARE @sql NVARCHAR(MAX) = "
SELECT ID,
NAME,
MODULE,
"+@Columns+",
(SELECT TOP 1 MARK
FROM #table t1
WHERE pvt.ID = t1.ID
AND pvt.NAME = t1.NAME
AND pvt.MODULE = t1.MODULE
ORDER BY enddate DESC) AS MARK
FROM (SELECT ID,
NAME,
MODULE,
ENDDATE,
ROW_NUMBER()
OVER(
partition BY ID, NAME, MODULE
ORDER BY enddate) AS rn
FROM #table) t
PIVOT ( Max(ENDDATE)
FOR rn IN("+@Columns+")) AS pvt
"
EXEC sp_executeSQL @sql
पिवट और अनपिवट का विवरण जांचें यहाँ.
नोट: जैसा कि आप देख सकते हैं, मैंने नवीनतम खोजने के लिए एक उप-क्वेरी का उपयोग किया Mark
। मैंने पूरी कोशिश की कि इसे कुछ बेहतर तरीके से बदल सकूं लेकिन मैं नहीं कर सका। फिर भी यह आपके लिए काम करेगा।