SQL सर्वर: PIVOTing स्ट्रिंग डेटा के उदाहरण


125

कुछ सरल SQL सर्वर PIVOT उदाहरण खोजने की कोशिश कर रहा है। अधिकांश उदाहरण जो मुझे मिले हैं उनमें संख्याओं को गिनना या समेटना शामिल है। मैं सिर्फ कुछ स्ट्रिंग डेटा पिवट करना चाहता हूं। उदाहरण के लिए, मेरे पास निम्नलिखित को लौटाने वाली एक क्वेरी है।

Action1 VIEW  
Action1 EDIT  
Action2 VIEW  
Action3 VIEW  
Action3 EDIT  

मैं परिणाम देने के लिए PIVOT (यदि संभव हो तो) का उपयोग करना चाहूंगा:

Action1 VIEW EDIT  
Action2 VIEW NULL  
Action3 VIEW EDIT  

क्या यह PIVOT कार्यक्षमता के साथ भी संभव है?



इस लिंक पर एक नज़र डालें: dotnetgalactics.wordpress.com/2009/10/23/… ( मददगार हो सकता है;)
Pato

आप इस लिंक को देख सकते हैं यदि अलग-अलग वस्तुओं की संख्या अज्ञात है, जिसका अर्थ है कि पिविंग के बाद कोई कॉलम गतिशील नहीं है। SQL सर्वर पिवट: डायनामिक क्वेरी के साथ कॉलम में पंक्तियों को परिवर्तित करना
maeenul

जवाबों:


165

याद रखें कि MAX एग्रीगेट फ़ंक्शन टेक्स्ट के साथ-साथ संख्याओं पर भी काम करेगा। इस क्वेरी को केवल तालिका को एक बार स्कैन करने की आवश्यकता होगी।

SELECT Action,
       MAX( CASE data WHEN 'View' THEN data ELSE '' END ) ViewCol, 
       MAX( CASE data WHEN 'Edit' THEN data ELSE '' END ) EditCol
 FROM t
 GROUP BY Action

+1 दोस्त ... आप गंभीरता से एक प्रतिभाशाली हैं। काश मैं यह जानने के लिए जल्द ही जाना जाता, बजाय कैसे जानने के लिए PIVOT!
15

@ Silmaril89 मान लेते हैं कि प्रश्न में दूसरा स्तंभ नाम 'डेटा' है और 1 कॉलम 'एक्शन' है
इमान

1
क्या कोई कारण है कि मुझे ...ELSE NULL END...इसके बजाय उपयोग क्यों नहीं करना चाहिए ...ELSE '' END...?
मो।

15
कौन सा तेज है, यह या PIVOT?
रॉबर्ट जेप्पेसेन

हाहाहा, तुमने तो मेरा दिमाग ही उड़ा दिया। मेरे सिर के पिछले हिस्से में मुझे इस बात का अंदाजा था कि हालांकि मैं एसक्यूएल सर्वर "सिर्फ डारनिट करना चाहिए!", लेकिन सोचा कि यह नहीं किया जा सकता है। फिर, मैंने यह देखा।
डेविड हे

54

तालिका सेटअप:

CREATE TABLE dbo.tbl (
    action VARCHAR(20) NOT NULL,
    view_edit VARCHAR(20) NOT NULL
);

INSERT INTO dbo.tbl (action, view_edit)
VALUES ('Action1', 'VIEW'),
       ('Action1', 'EDIT'),
       ('Action2', 'VIEW'),
       ('Action3', 'VIEW'),
       ('Action3', 'EDIT');

आपकी टेबल: SELECT action, view_edit FROM dbo.tbl

आपकी टेबल

PIVOT का उपयोग किए बिना क्वेरी:

SELECT Action, 
[View] = (Select view_edit FROM tbl WHERE t.action = action and view_edit = 'VIEW'),
[Edit] = (Select view_edit FROM tbl WHERE t.action = action and view_edit = 'EDIT')
FROM tbl t
GROUP BY Action

PIVOT का उपयोग करके क्वेरी:

SELECT [Action], [View], [Edit] FROM
(SELECT [Action], view_edit FROM tbl) AS t1 
PIVOT (MAX(view_edit) FOR view_edit IN ([View], [Edit]) ) AS t2

दोनों प्रश्न परिणाम:
यहाँ छवि विवरण दर्ज करें


इस दुर्लभ, स्पष्ट उत्तर के लिए धन्यवाद। यह immedeately एक उदाहरण और परिणामी डेटासेट
दिखाता है

मुझे पता है कि यह पुराना है, लेकिन यह सबसे स्पष्ट, सबसे अच्छा सचित्र धुरी प्रदर्शन है जिसे मैंने देखा है।
स्टेन शॉ

52

यदि आप विशेष रूप से SQL सर्वर PIVOT फ़ंक्शन का उपयोग करना चाहते हैं, तो यह काम करना चाहिए, यह मानते हुए कि आपके दो मूल कॉलम एक्ट और cmd कहलाते हैं। (हालांकि यह देखने के लिए बहुत सुंदर नहीं है।)

SELECT act AS 'Action', [View] as 'View', [Edit] as 'Edit'
FROM (
    SELECT act, cmd FROM data
) AS src
PIVOT (
    MAX(cmd) FOR cmd IN ([View], [Edit])
) AS pvt


6

खैर, आपके नमूने के लिए और किसी भी सीमित संख्या में अद्वितीय स्तंभों के साथ, इसे ऐसा करना चाहिए।

select 
    distinct a,
    (select distinct t2.b  from t t2  where t1.a=t2.a and t2.b='VIEW'),
    (select distinct t2.b from t t2  where t1.a=t2.a and t2.b='EDIT')
from t t1


0

मेरे पास एक ऐसी स्थिति थी जहां मैं स्ट्रिंग को पार्स कर रहा था और प्रश्न में स्ट्रिंग के पहले दो स्थान एक स्वास्थ्य देखभाल के दावों के कोडिंग मानक के क्षेत्र के नाम होंगे। इसलिए मैं स्ट्रिंग्स को बाहर निकालता हूं और एफ 4, यूआर और यूक्यू या व्हाट्सन के लिए मान प्राप्त करता हूं। यह एक उपयोगकर्ता के लिए एक रिकॉर्ड या कुछ रिकॉर्ड पर बहुत अच्छा था। लेकिन जब मैं सैकड़ों रिकॉर्ड देखना चाहता था और सभी यूजर्स के लिए इसका मूल्य एक PIVOT होना चाहिए था। यह विशेष रूप से उत्कृष्टता के लिए बहुत सारे रिकॉर्ड निर्यात करने के लिए अद्भुत था। मेरे द्वारा प्राप्त विशिष्ट रिपोर्टिंग अनुरोध "हर बार जब किसी ने बेनाड्रील के लिए दावा प्रस्तुत किया था, तो उन्होंने एफ 4, यूआर, और यूक्यू के क्षेत्र में क्या मूल्य प्रस्तुत किया था। मेरे पास एक ओपेल एपीएलवाई था जिसने कोलिटेल और मूल्य फ़ील्ड बनाए थे।

PIVOT(
  min(value)
  FOR ColTitle in([F4], [UR], [UQ])
 )
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.