MSSQL क्वेरी और Fetch से PHP दृश्य में डेटा कैसे प्राप्त करें

Dec 04 2020

मेरे पास इस तरह क्वेरी सामग्री के साथ एक MSSQL 2005 डेटाबेस है:

नोपा कोड नाम गण
00115301 D031 एडम 1 है
00130015 है D031 एडम
00149998 D026 जाम 1 है
00149970 है D028 FIKI 1 है
00142641 है D028 FIKI
00127700 है D028 FIKI

रिपोर्ट कारण के लिए, मुझे आउटपुट एक तालिका की तरह चाहिए:

एडम जाम FIKI ... (डायनामिक कंटेंट आधारित नया रिकॉर्ड)
00115301 00149998 00149970 है ...
00130015 है - 00142641 है ...
- - 00127700 है ...

क्या कोई मेरी मदद कर सकता है??

जवाब

Jason Dec 04 2020 at 16:46

आप CASEबयानों के साथ एक धुरी कर सकते हैं । यह मूल रूप से पिवट करने का मैनुअल तरीका है और यदि आप 2005 से पहले SQL सर्वर के किसी संस्करण का उपयोग कर रहे थे, तो आपको उस मार्ग पर जाने की आवश्यकता होगी। SQL सर्वर 2005 ने PIVOT फ़ंक्शन को जोड़ा ।

क्योंकि आपको गतिशील होने की आवश्यकता है, इसलिए आपको गतिशील SQL का उपयोग करना होगा । यह पैर का बहुत काम है लेकिन निश्चित रूप से उल्लेखनीय है।

मैं एक वैश्विक अस्थायी तालिका में आपकी तालिका सामग्री बनाने जा रहा हूं (गतिशील SQL में काम करने के लिए वैश्विक होना चाहिए)।

-- CREATE GLOBAL TEMPORARY TABLE
CREATE TABLE ##tablename (
  [nopas] VARCHAR(8),
  [code] VARCHAR(4),
  [name] VARCHAR(64),
  [order] SMALLINT
);

INSERT INTO ##tablename
  ([nopas], [code], [name], [order])
VALUES
 ('00115301','D031','ADAM',  1)
,('00130015','D031','ADAM',  2)
,('00149998','D026','JAMES', 1)
,('00149970','D028','FIKI',  1)
,('00142641','D028','FIKI',  2)
,('00127700','D028','FIKI',  3);

अगला, मैं SELECTसिर्फ एक और अस्थायी तालिका में अद्वितीय नामों के लिए जा रहा हूं और उन्हें एक IDENTITYसाथ जोड़ूंगा जिसके माध्यम से मैं एक लूप के लिए इसमें प्रवेश कर सकता हूं।

SELECT IDENTITY(INT, 1,1) as [id], [name] 
INTO #temp
FROM ##tablename
GROUP BY [name];

अब मुश्किल हिस्सा आता है। PRINT @dynSQLमैं क्या गतिशील (नीचे) प्राप्त करने के लिए कोशिश कर रहा हूँ उत्पन्न करता है। हम की जरूरत है , और के लिए अंतिम परिणाम। हम स्टेटमेंट के दूसरे भाग में पिवट कर रहे हैं , और इसके द्वारा एकत्रित कर रहे हैं ; लेकिन क्योंकि हमारे पास आपकी मूल तालिका सामग्री में एक समूहीकरण है, यह केवल एक पंक्ति के मूल्य के आधार पर पुनर्प्राप्त करेगा । तो, परिणाम यह है कि यह एकत्रीकरण को हटा देता है। यदि आपके पास अपनी मूल सामग्री में कॉलम नहीं है , तो हमें उसे उत्पन्न करने के लिए ROW_NUMBER () फ़ंक्शन * का उपयोग करना होगा ।SELECT[order][name][nopas][name]MAX([nopas])[order]MAX([nopas])MAX[order]PARTITIONED BY[name][order]

संपादित करें: मैंने पाया कि ROW_NUMBER()फ़ंक्शन केवल SQL Server 2012 और नए में उपलब्ध है।

-- PRINT @dynSQL result
SELECT * FROM
(SELECT [order], [name], [nopas]
  FROM ##tablename) AS sourceTable
PIVOT(
MAX([nopas])
FOR [name] IN ([ADAM],[FIKI],[JAMES])
) AS pivotTable;
-- The leg work to create the dynamic SQL.
DECLARE @count INT = 1;
DECLARE @max INT = (SELECT MAX(id) FROM #temp);
DECLARE @dynSQL VARCHAR(2048) = 'SELECT * FROM
(SELECT [order], [name], [nopas]
  FROM ##tablename) AS sourceTable
PIVOT(
MAX([nopas])
FOR [name] IN (';

SET @count = 1;
WHILE(@count <= @max)
BEGIN
  SET @dynSQL += '[' + (SELECT [name] FROM #temp WHERE id = @count) + '],';
  SET @count += 1;
END

SET @dynSQL = LEFT(@dynSQL, DATALENGTH(@dynSQL) -1) + ')
) AS pivotTable;';

PRINT @dynSQL;
EXEC (@dynSQL);

DROP TABLE ##tablename;
DROP TABLE #temp;

ओह, अगर आप [order]कॉलम को रिजल्ट से हटाना चाहते हैं । आप SELECT * INTO ##newGlobalTableगतिशील SQL और फिर ALTERनई तालिका और DROPस्तंभ में उपयोग कर सकते हैं ।