कॉलम नाम के साथ अनपाइव करें


127

मेरे पास StudentMarksकॉलम के साथ एक टेबल है Name, Maths, Science, English। डेटा की तरह है

Name,  Maths, Science, English  
Tilak, 90,    40,      60  
Raj,   30,    20,      10

मैं इसे निम्नलिखित की तरह व्यवस्थित करना चाहता हूं:

Name,  Subject,  Marks
Tilak, Maths,    90
Tilak, Science,  40
Tilak, English,  60

बिना धुरी के मैं नाम, निशान ठीक से प्राप्त करने में सक्षम हूं, लेकिन Subjectवांछित परिणाम सेट में स्तंभ में स्रोत तालिका में स्तंभ नाम प्राप्त करने में सक्षम नहीं हूं ।

इसे कैसे प्राप्त किया जा सकता है?

मैं अब तक निम्नलिखित प्रश्न (नाम, निशान पाने के लिए) तक पहुँच गया हूँ

select Name, Marks from studentmarks
Unpivot
(
  Marks for details in (Maths, Science, English)

) as UnPvt

1
क्या आपने अब तक जो किया है, उसे पोस्ट कर सकते हैं? क्वेरी / आउटपुट।
हार्ट सीओ

जवाबों:


204

आपकी क्वेरी बहुत करीब है। आपको निम्नलिखित का उपयोग करने में सक्षम होना चाहिए जिसमें subjectअंतिम चयन सूची शामिल है:

select u.name, u.subject, u.marks
from student s
unpivot
(
  marks
  for subject in (Maths, Science, English)
) u;

SQL फिडेल को डेमो के साथ देखें


@bluefeet क्या कोई ऐसा तरीका है जिसे आपको नाम (गणित, विज्ञान, अंग्रेजी) निर्दिष्ट करने की आवश्यकता नहीं है? मैं कई तालिकाओं के लिए यह ऑपरेशन कर रहा हूं, सभी एक ही संरचना के साथ लेकिन विभिन्न स्तंभ नामों के साथ।
LBogaardt

1
@Logardt नहीं, आपको शामिल करने के लिए स्तंभों को स्पष्ट रूप से परिभाषित करने की आवश्यकता है।
jjjjjjjjjjjj

@LBogardt यहां मेरे उत्तर पर एक नज़र डालें , आप कॉलम के नामों को निर्दिष्ट किए बिना डायनेमिक sql को अनप्राइव करने के लिए उपयोग कर सकते हैं।
टैरिन

8

आप निम्न कोड के साथ तर्क के अनुक्रम का उपयोग करके मानक sql संयुक्त राष्ट्र की धुरी बनाने की कोशिश कर सकते हैं। निम्नलिखित कोड में 3 चरण हैं:

  1. क्रॉस ज्वाइन का उपयोग करके प्रत्येक पंक्ति के लिए कई प्रतियां बनाएं (इस मामले में विषय कॉलम भी बनाएं)
  2. कॉलम "अंक" बनाएं और केस एक्सप्रेशन का उपयोग करके प्रासंगिक मूल्यों को भरें (उदा: यदि विषय विज्ञान है तो विज्ञान स्तंभ से मान चुनें)
  3. किसी भी अशक्त संयोजन को हटा दें (यदि मौजूद है, तो टेबल एक्सप्रेशन को पूरी तरह से टाला जा सकता है यदि बेस टेबल में कड़ाई से शून्य मान नहीं हैं)

     select *
     from 
     (
        select name, subject,
        case subject
        when 'Maths' then maths
        when 'Science' then science
        when 'English' then english
        end as Marks
    from studentmarks
    Cross Join (values('Maths'),('Science'),('English')) AS Subjct(Subject)
    )as D
    where marks is not null;

यह भी किसी भी RDBMS के साथ काम करता है! VALUES, जब उपलब्ध नहीं होता है, तो SELECT ... UNION ... SELECT ... के साथ एक उपश्रेणी द्वारा प्रतिस्थापित किया जा सकता है, हालांकि उस पार के प्रदर्शन के बारे में सोचकर ...
Cristi S.

0

छात्र से चयन करें *

UNPIVOT (गणित (विज्ञान, अंग्रेजी) में विषयों के लिए अंक);


1
यह पहले से ही लगभग 6 साल पहले स्वीकार किए गए और अत्यधिक उत्कीर्ण उत्तर के रूप में एक ही उत्तर है?
काल्पनिक

0

क्रॉस जॉइन का उपयोग करने का एक और तरीका क्रॉस जॉइन के अंदर कॉलम नामों को निर्दिष्ट करना होगा

select name, Subject, Marks 
from studentmarks
Cross Join (
values (Maths,'Maths'),(Science,'Science'),(English,'English')
) un(Marks, Subject)
where marks is not null;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.