2016-03-22 17 views
6

मुझे पता है कि यहां कई अनपिनत/क्रॉस चर्चाएं हैं लेकिन मैं अपनी समस्या को शामिल करने वाली कोई भी चर्चा नहीं ढूंढ पा रहा था। जो मैंने अभी तक प्राप्त किया है वह निम्नलिखित है:टीएसक्यूएल नामित पंक्तियों के साथ एकाधिक कॉलम unpivot संभव है?

SELECT Perc, Salary 
FROM (
    SELECT jobid, Salary_10 AS Perc10, Salary_25 AS Perc25, [Salary_Median] AS Median 
    FROM vCalculatedView 
    WHERE JobID = '1' 
    GROUP BY JobID, SourceID, Salary_10, Salary_25, [Salary_Median] 
) a 
UNPIVOT (
    Salary FOR Perc IN (Perc10, Perc25, Median) 
) AS calc1 

अब, मैं क्या चाहता हूं कि कई अन्य कॉलम, उदाहरण के लिए। एक नाम बोनस जिसे मैं भी Perc10, Perc25 और Median पंक्तियों में रखना चाहता हूँ।

एक विकल्प के रूप में, मैंने क्रॉस लागू करने के साथ एक प्रश्न भी बनाया, लेकिन यहां ऐसा लगता है कि आप पंक्तियों को "बल" नहीं कर सकते जैसे कि आप अनपॉट के साथ कर सकते हैं। दूसरे शब्दों में, मेरे पास कस्टम प्रकार नहीं हो सकता है, लेकिन केवल एक प्रकार है जो तालिका के भीतर किसी संख्या के अनुसार है, अगर मैं सही हूं? कम से कम, यहां मुझे परिणाम मिलना है जैसे मैं चाहता हूं, लेकिन पंक्तियां गलत क्रम में हैं और मेरे पास पेर्क 10 जैसी पंक्तियां नहीं हैं जो अच्छी होंगी।

SELECT crossapplied.Salary, 
     crossapplied.Bonus 
FROM vCalculatedView v 
CROSS APPLY (
    VALUES 
      (Salary_10, Bonus_10) 
     , (Salary_25, Bonus_25) 
     , (Salary_Median, Bonus_Median) 
) crossapplied (Salary, Bonus) 
WHERE JobID = '1' 
GROUP BY crossapplied.Salary, 
     crossapplied.Bonus 

पर्स यहां पर प्रतिशत के लिए खड़ा है।

+--------------+---------+-------+ 
| Calculation | Salary | Bonus | 
+--------------+---------+-------+ 
| Perc10  |  25 |  5 | 
| Perc25  |  35 | 10 | 
| Median  |  27 |  8 | 
+--------------+---------+-------+ 

मैं कुछ याद आती है या मैंने कुछ गलत किया कार्य करें:

आउटपुट कुछ इस तरह होना करने का इरादा है? मैं एमएसएसएलएल 2014 का उपयोग कर रहा हूं, आउटपुट एसएसआरएस में जा रहा है। अग्रिम में किसी भी संकेत के लिए बहुत बहुत धन्यवाद! स्पष्टीकरण के लिए

संपादित करें:

+--------------+---------+ 
    | Calculation | Salary | 
    +--------------+---------+ 
    | Perc10  |  25 | 
    | Perc25  |  35 | 
    | Median  |  27 | 
    +--------------+---------+ 

तो यह कॉलम "बोनस" यहाँ का अभाव: Unpivot-विधि निम्नलिखित उत्पादन देता है।

पार लागू करें-विधि निम्नलिखित उत्पादन देता है: तो अगर आप इसे इरादा उत्पादन की तुलना, आप ध्यान देंगे कि कॉलम "गणना" याद आ रही है और पंक्ति सॉर्टिंग गलत है

+---------+-------+ 
| Salary | Bonus | 
+---------+-------+ 
|  35 | 10 | 
|  25 |  5 | 
|  27 |  8 | 
+---------+-------+ 

(ध्यान दें कि पंक्ति 25 | 5 पहले की बजाय दूसरी पंक्ति में है)।

संपादित करें 2: देखें की परिभाषा और नमूना डेटा: दृश्य मूल रूप से तालिका के गणना वाले कॉलम जोड़ता है। तालिका में, मुझे प्रत्येक जॉब आईडी के लिए वेतन और बोनस जैसे कॉलम मिल गए हैं। देखें तो सिर्फ इस तरह प्रतिशतक गणना करता है:

Select 
    Percentile_Cont(0.1) 
    within group (order by Salary) 
    over (partition by jobID) as Salary_10, 

    Percentile_Cont(0.25) 
    within group (order by Salary) 
    over (partition by jobID) as Salary_25 
from Tabelle 

तो उत्पादन की तरह है:

+----+-------+---------+-----------+-----------+ 
| ID | JobID | Salary | Salary_10 | Salary_25 | 
+----+-------+---------+-----------+-----------+ 
| 1 |  1 |  100 |  60 |  70 | 
| 2 |  1 |  100 |  60 |  70 | 
| 3 |  2 |  150 |  88 |  130 | 
| 4 |  3 |  70 |  40 |  55 | 
+----+-------+---------+-----------+-----------+ 

अंत में, दृश्य एक संग्रहीत प्रक्रिया में parameterized कर दिया जाएगा।

+1

आपका 'vCalculatedView' अग्रिम में गणना करने के लिए लगता है ... आपका' समूह by' कुछ नहीं कर रहा है ... कृपया अपने बयान के साथ परिणाम दिखाएं और कुछ नमूना डेटा और अपेक्षित आउटपुट प्रदान करें। – Shnugo

+0

क्रॉस लागू कोड में समूह कुछ करता है: यदि मैं इसे नहीं डालता, तो Perc10, Perc25, Median दोहराएगा। ऐसा इसलिए है क्योंकि एक जॉब आईडी कर्मचारी आईडी नहीं है और इस तरह, एक नौकरी आईडी में एक से अधिक कर्मचारी हो सकते हैं। – ksauter

+0

ठीक है। मुझे पता है तुम्हारा क्या मतलब है। हो सकता है कि एक 'सीईटीई' 'चयन डिस्टिंट' के साथ है जिसे आप चाहते हैं। 'ग्रुप बाय' आप 'MAX()' या 'SUM()' जैसे समेकन के लिए उपयोग करेंगे, कृपया अपनी वर्तमान क्वेरी का परिणाम प्रदान करें और आपका डेटा कैसा दिखाना चाहिए। – Shnugo

उत्तर

1

क्या यह आपका दृष्टिकोण हो सकता है?

आपके संपादन के बाद मैं समझता हूं कि CROSS APPLY के साथ आपका समाधान सही डेटा के साथ वापस आ जाएगा, लेकिन सही आउटपुट में नहीं। आप अपने VALUES के लिए निरंतर मान जोड़ सकते हैं और छंटाई कर एक आवरण SELECT में:

SELECT wrapped.Calculation, 
     wrapped.Salary, 
     wrapped.Bonus 
FROM 
(
    SELECT crossapplied.* 
    FROM vCalculatedView v 
    CROSS APPLY (
     VALUES 
       (1,'Perc10',Salary_10, Bonus_10) 
      , (2,'Perc25',Salary_25, Bonus_25) 
      , (3,'Median',Salary_Median, Bonus_Median) 
    ) crossapplied (SortOrder,Calculation,Salary, Bonus) 
    WHERE JobID = '1' 
    GROUP BY crossapplied.SortOrder, 
      crossapplied.Calculation, 
      crossapplied.Salary, 
      crossapplied.Bonus 
) AS wrapped 
ORDER BY wrapped.SortOrder 
+0

धन्यवाद! मैंने आपके समाधान को सही के रूप में चिह्नित किया। हालांकि, अन्य पाठकों के लिए, आपको ग्रुप बाय क्लॉज में, केवल वेतन और बोनस के लिए सभी कॉलम (सॉर्टऑर्डर, गणना, वेतन, बोनस) डालना होगा। कल रात, मैंने सीटीई और बाएं जॉइन के साथ यूएनपीआईवीओटी विधि के साथ प्रश्न लिखा, लेकिन यह निश्चित रूप से एक लंबा कोड है। पाठकों के आने के लिए, मैं इसे एक और जवाब के रूप में रखूंगा, लेकिन यह आपके समाधान को हरा नहीं है। आपके समाधान एक बार फिर से दिखाते हैं कि ज्यादातर समय, क्रॉस आवेदन असीमित धड़कता है जैसे कई ब्लॉगर्स तुलना में दिखाते हैं। स्वीकृति के लिए – ksauter

+1

Thx! मैंने 'GROUP BY COLUMNS' के बारे में आपके संकेत को दर्शाने के लिए अपना उत्तर संपादित किया। अगर आपको मेरा जवाब पसंद है तो इसे अतिरिक्त रूप से वोट देना अच्छा होगा। मतदान और स्वीकार करना दो अलग-अलग कदम हैं ... फिर से Thx! – Shnugo

संबंधित मुद्दे