2013-03-28 16 views
14

बिना डायनामिक पिवट एसक्यूएल स्टेटमेंट लिखने का प्रयास करने के लिए पिवोट पंक्तियों को पंक्तियों में पंक्तियां। जहां TEST_NAME में 12 अलग-अलग मान हो सकते हैं (इस प्रकार 12 कॉलम हैं)। कुछ वैल इंट, डेसिमल, या वर्चर डेटा प्रकार होंगे। मैंने देखा है कि अधिकांश उदाहरणों में से कुछ शामिल हैं। मैं एक सीधी मूल्य पिवट की तलाश में हूं।कुल

Source Table 

╔═══════════╦══════╦═══════╗ 
║ TEST_NAME ║ SBNO ║ VAL ║ 
╠═══════════╬══════╬═══════╣ 
║ Test1  ║ 1 ║ 0.304 ║ 
║ Test1  ║ 2 ║ 0.31 ║ 
║ Test1  ║ 3 ║ 0.306 ║ 
║ Test2  ║ 1 ║ 2.3 ║ 
║ Test2  ║ 2 ║ 2.5 ║ 
║ Test2  ║ 3 ║ 2.4 ║ 
║ Test3  ║ 1 ║ PASS ║ 
║ Test3  ║ 2 ║ PASS ║ 
╚═══════════╩══════╩═══════╝ 


Desired Output 
╔══════════════════════════╗ 
║ SBNO Test1 Test2 Test3 ║ 
╠══════════════════════════╣ 
║ 1 0.304 2.3 PASS ║ 
║ 2 0.31 2.5 PASS ║ 
║ 3 0.306 2.4 NULL ║ 
╚══════════════════════════╝ 

उत्तर

22

PIVOT फ़ंक्शन को इसे काम करने के लिए एकत्रीकरण की आवश्यकता होती है। ऐसा लगता है कि आपका VAL कॉलम varchar है इसलिए आपको MAX या MIN कुल कार्यों का उपयोग करना होगा।

परीक्षण की संख्या सीमित है, तो आप कर सकते हैं हार्ड कोड मान:

select sbno, Test1, Test2, Test3 
from 
(
    select test_name, sbno, val 
    from yourtable 
) d 
pivot 
(
    max(val) 
    for test_name in (Test1, Test2, Test3) 
) piv; 

SQL Fiddle with Demo देखें।

आपके ओपी में, आपने कहा है कि आपके पास कॉलम में बदलने के लिए बड़ी संख्या में पंक्तियां होंगी। अगर ऐसा है, तो आप गतिशील एसक्यूएल का उपयोग कर सकते हैं:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(TEST_NAME) 
        from yourtable 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT sbno,' + @cols + ' 
      from 
      (
       select test_name, sbno, val 
       from yourtable 
      ) x 
      pivot 
      (
       max(val) 
       for test_name in (' + @cols + ') 
      ) p ' 

execute(@query) 

SQL Fiddle with Demo देखें।

| SBNO | TEST1 | TEST2 | TEST3 | 
--------------------------------- 
| 1 | 0.304 | 2.3 | PASS | 
| 2 | 0.31 | 2.5 | PASS | 
| 3 | 0.306 | 2.4 | (null) | 
+0

ग्रेट उत्तर, क्या सी # में एक ही दृष्टिकोण का उपयोग करना संभव है? – Oliver

+0

@ ओलिवर सी # में पिवट करने के तरीके हैं लेकिन मैं उनसे अत्यधिक परिचित नहीं हूं। मैं सुझाव देता हूं कि SO पर linq-to-sql के बारे में कुछ प्रश्नों को पिवट के साथ देखें। कई पाइवेट खोज में पाए जा सकते हैं। – Taryn

4

बिना किसी एकत्र किए PIVOT का कोई तरीका नहीं है।

CREATE TABLE #table1 
(
    TEST_NAME VARCHAR(10), 
    SBNO VARCHAR(10), 
    VAL VARCHAR(10) 
); 

INSERT INTO #table1 (TEST_NAME, SBNO, VAL) 
VALUES ('Test1' ,'1', '0.304'), 
     ('Test1' ,'2', '0.31'), 
     ('Test1' ,'3', '0.306'), 
     ('Test2' ,'1', '2.3'), 
     ('Test2' ,'2', '2.5'), 
     ('Test2' ,'3', '2.4'), 
     ('Test3' ,'1', 'PASS'), 
     ('Test3' ,'2', 'PASS') 

WITH T AS 
(
    SELECT SBNO, VAL, TEST_NAME  
     FROM #table1 
) 
SELECT * 
    FROM T 
PIVOT (MAX(VAL) FOR TEST_NAME IN([Test1], [Test2], [Test3])) P 
0

का संभावित हल सुनिश्चित करना है कि अनिवार्य एकत्रीकरण ही कभी एक भी रिकॉर्ड करने के लिए लागू किया जाता है हो सकता है:

दोनों संस्करणों ही परिणाम प्राप्त होगा। Excel में, उदाहरण के लिए उत्पादन किया जा सकता है:

SO15674373 example

जहां पंक्ति लेबल तल पर अद्वितीय सूचकांक संख्या के साथ कोशिकाओं के एक कॉलम शामिल है।