/ / एक पंक्ति में डेटा की एकाधिक पंक्तियाँ - SQL सर्वर - sql, sql-server

एक पंक्ति में डेटा की एकाधिक पंक्तियां - एसक्यूएल सर्वर - एसक्यूएल, एसक्यूएल-सर्वर

मेरे पास एक टेबल है जो इस तरह दिखता है

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। मैंने पूरी कोशिश की कि इसे कुछ बेहतर तरीके से बदल सकूं लेकिन मैं नहीं कर सका। फिर भी यह आपके लिए काम करेगा।