2009-04-29 20 views
8

मेरे पास कॉलम sales(int), month(int) के साथ एक तालिका है। मैं हर महीने से संबंधित बिक्री की राशि पुनः प्राप्त करना चाहता हूं। मुझे प्रत्येक महीने के अनुरूप 12 कॉलम के रूप में ouput की आवश्यकता है जिसमें प्रत्येक कॉलम (महीने) के लिए बिक्री वाला एक रिकॉर्ड होगा।एसक्यूएल सर्वर: पंक्तियों को पंक्तियों में कनवर्ट करें

उत्तर

10

काम करता है आप कॉलम के साथ पंक्तियों स्विच करने के लिए PIVOT पर एक नज़र रखना चाहिए। यह प्रत्येक महीने के लिए एक चयन कथन रोकता है। कुछ ऐसा:

DECLARE @salesTable TABLE 
(
    [month] INT, 
    sales INT 
) 

-- Note that I use SQL Server 2008 INSERT syntax here for inserting 
-- multiple rows in one statement! 
INSERT INTO @salesTable 
VALUES (0, 2) ,(0, 2) ,(1, 2) ,(1, 2) ,(2, 2) 
     ,(3, 2) ,(3, 2) ,(4, 2) ,(4, 2) ,(5, 2) 
     ,(6, 2) ,(6, 2) ,(7, 2) ,(8, 2) ,(8, 2) 
     ,(9, 2) ,(10, 2) ,(10, 2) ,(11, 2) ,(11, 2) 

SELECT [0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11] 
FROM 
(
    SELECT [month], sales 
    FROM @salesTable 
) AS SourceTable 
PIVOT 
(
    SUM(sales) 
    FOR [month] IN ([0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11]) 
) AS PivotTable 
+0

आपको नियमित प्री-2008 INSERT वाक्यविन्यास –

+0

दिखाना चाहिए, शायद आप सही हैं, हालांकि प्रश्न में SQL सर्वर संस्करण का उल्लेख नहीं किया गया था। वाक्यविन्यास अंतर के पाठक को सूचित करने के लिए मेरा उत्तर अपडेट किया गया। –

+0

@ सहिल गर्ग: क्या आपको यह काम करने के लिए मिला? –

2

सुंदर नहीं ... लेकिन यह अच्छी तरह से

SELECT 
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 1) [Sales1], 
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 2) [Sales2], 
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 3) [Sales3], 
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 4) [Sales4], 
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 5) [Sales5], 
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 6) [Sales6], 
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 7) [Sales7], 
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 8) [Sales8], 
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 9) [Sales9], 
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 10) [Sales10], 
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 11) [Sales11], 
    (SELECT SUM(Sales) FROM SalesTable WHERE [Month] = 12) [Sales12] 
1

आप इसे OLAP के साथ कर सकते हैं। Here विषय पर एमएसडीएन दस्तावेज का एक और लिंक है।

ओलाप के साथ, आप जिस लेआउट की आवश्यकता है, उसके साथ आप अपनी जानकारी के साथ एक घन बना सकते हैं।

आपको लगता है कि जिस तरह से जाने के लिए नहीं करना चाहते हैं, तो आप नेट, जावा, TransacSQL, या SQLServer डेटा हेरफेर करने के लिए अपनी पसंद की भाषा के साथ सारांश टेबल बना करना होगा।

2

यहाँ एक वैकल्पिक तरीका धुरी है कि आप एक छोटे से अधिक नियंत्रण (स्तंभ नाम से अधिक विशेष रूप से) देता है लिखने के लिए है। इसके लिए गतिशील एसक्यूएल उत्पन्न करना भी थोड़ा आसान है।

यह रॉबिन के जवाब देने के लिए समान है, लेकिन केवल एक बार मेज से टकराने का लाभ दिया है:

select 
    Sales1 = sum(case when Month = 1 then Sales end) 
, Sales2 = sum(case when Month = 2 then Sales end) 
, Sales3 = sum(case when Month = 3 then Sales end) 
-- etc.. 
from SalesTable; 

मैं कुछ जांच किया था, और ऐसा लगता है नई धुरी ऑपरेटर जैसी क्वेरी के इस प्रकार के लिए सिर्फ वाक्य रचना चीनी है । पूछताछ की योजना समान दिखने लगती है।

एक तरफ एक दिलचस्प के रूप में, unpivot ऑपरेटर भी सिर्फ वाक्य रचना चीनी हो रहा है। उदाहरण के लिए:

यदि आपके पास एक मेज की तरह:

Create Table Sales (JanSales int, FebSales int, MarchSales int...) 

आप लिख सकते हैं:

select unpivoted.monthName, unpivoted.sales 
from Sales s 
outer apply (
    select 'Jan', JanSales union all 
    select 'Feb', FebSales union all 
    select 'March', MarchSales 
) unpivoted(monthName, sales); 

और unpivoted डेटा प्राप्त ...

0

आसानी से पंक्तियों में कॉलम स्थानांतरित करने के लिए इसके नामों के साथ आपको एक्सएमएल का उपयोग करना चाहिए। मेरे ब्लॉग में मुझे इसका वर्णन उदाहरण के साथ किया गया था: Link

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