मुझे यकीन है कि मुझे यहां कुछ याद आ रहा है।मैं पंक्ति डेटा को कॉलम के रूप में कैसे क्वेरी कर सकता हूं?
मैं इस तरह एक डाटासेट है:
FK RowNumber Value Type Status 1 1 aaaaa A New 1 2 bbbbb B Good 1 3 ccccc A Bad 1 4 ddddd C Good 1 5 eeeee B Good 2 1 fffff C Bad 2 2 ggggg A New 2 3 hhhhh C Bad 3 1 iiiii A Good 3 2 jjjjj A Good
मैं शीर्ष 3 परिणामों क्वेरी और उन्हें स्तंभों के रूप में पिवट करने के लिए चाहते हैं, इसलिए अंतिम परिणाम सेट इस तरह दिखता है:
FK Value1 Type1 Status1 Value2 Type2 Status2 Value3 Type3 Status3 1 aaaaa A New bbbbb B Good ccccc A Bad 2 fffff C Bad ggggg A New hhhhh C Bad 3 iiiii A Good jjjjj A Good
मैं SQL सर्वर 2005 में इसे कैसे पूरा कर सकता हूं?
मैं PIVOT का उपयोग करके इसका प्रयास कर रहा हूं, लेकिन मैं अभी भी उस कीवर्ड से बहुत अपरिचित हूं और इसे जिस तरह से चाहता हूं उसे काम नहीं कर सकता।
SELECT * --Id, [1], [2], [3]
FROM
(
SELECT Id, Value, Type, Status
, ROW_NUMBER() OVER (PARTITION BY Id ORDER Status, Type) as [RowNumber]
FROM MyTable
) as T
PIVOT
(
-- I know this section doesn't work. I'm still trying to figure out PIVOT
MAX(T.Value) FOR RowNumber IN ([1], [2], [3]),
MAX(T.Type) FOR RowNumber IN ([1], [2], [3]),
MAX(T.Status) FOR RowNumber IN ([1], [2], [3])
) AS PivotTable;
मेरे वास्तविक डेटा सेट में थोड़ा और अधिक इस से जटिल है, और मैं शीर्ष 10 रिकॉर्ड, नहीं शीर्ष 3 की जरूरत है, तो मैं बस हर एक के लिए CASE WHEN RowNumber = X THEN...
करने के लिए नहीं करना चाहती।
अद्यतन
मैं सभी प्रश्नों के उत्तर नीचे परीक्षण किया है, और पाया उनमें से ज्यादातर छोटे डेटा सेट में कोई स्पष्ट प्रदर्शन अंतर (3k रिकॉर्ड के आसपास) के साथ एक ही के बारे में लग रहे हैं, लेकिन वहाँ कुछ अंतर जब चल रहा था बड़े डेटा सेट के खिलाफ प्रश्न।
शीर्ष 10 पंक्तियों में 80,000 रिकॉर्ड और 5 कॉलम के लिए पूछताछ के माध्यम से मेरे परीक्षणों के परिणाम यहां दिए गए हैं, इसलिए मेरा अंतिम परिणाम सेट 50 कॉलम + Id
कॉलम था। मेरा सुझाव है कि आप यह तय करने के लिए स्वयं का परीक्षण करें कि कौन सा आपके और आपके पर्यावरण के लिए सबसे अच्छा काम करता है।
unpivoting और डेटा फिर से पिवट की bluefoot's answer के बारे में 12 सेकंड में सबसे तेजी से औसत है। मुझे यह जवाब भी पसंद आया क्योंकि मुझे इसे पढ़ने और बनाए रखने में सबसे आसान लगता है।
Aaron's answer और koderoid's answer दोनों
MAX(CASE WHEN RowNumber = X THEN ...)
का उपयोग करने का सुझाव देते हैं, और लगभग 13 सेकंड में औसत के पीछे थे।कई
PIVOT
बयानों का उपयोग करने का Rodney's answer लगभग 16 सेकंड औसतन, हालांकि यह तेजी से कम धुरी बयान (मेरे परीक्षण था 5) के साथ हो सकता है।और Aaron's answer की पहली छमाही है कि एक CTE का उपयोग कर सुझाव और
OUTER APPLY
धीमी थी। मुझे नहीं पता कि यह कितना समय लगेगा क्योंकि मैंने इसे 2 मिनट के बाद रद्द कर दिया था, और यह लगभग 3k रिकॉर्ड, 3 पंक्तियों और 3 कॉलम के साथ 80k रिकॉर्ड, 10 पंक्तियों और 5 कॉलम के बजाय था।
'ddddd' और' eeeee' साथ पंक्ति का क्या हुआ? – Kermit
वे अंतिम सेट के बाद से मैं केवल शीर्ष एक्स रिकॉर्ड प्राप्त करने में रुचि है परिणाम में शामिल @njk नहीं कर रहे हैं (मेरे उदाहरण में मैं 3 उपयोग कर रहा हूँ, लेकिन मेरी वास्तविक क्वेरी में मैं शीर्ष 10 रिकॉर्ड की जरूरत है) – Rachel
क्या है "शीर्ष 10" चुनने के मानदंड? – Kermit