2009-06-03 15 views
14

में एकाधिक कॉलम पिवट एक टेबल के साथ काम कर रहा हूं जहां कई पंक्तियां हैं जिन्हें मुझे स्तंभों में पिच करने की आवश्यकता है। तो पिवट इस के लिए एकदम सही समाधान है, और जब मुझे केवल एक फ़ील्ड चाहिए तो अच्छी तरह से काम करता है। मुझे पिवट के आधार पर कई क्षेत्रों को वापस करने की जरूरत है। यहाँ बारीकियों के साथ छद्म कोड बाहर छीन लिया जाता है:टी-एसक्यूएल

SELECT 
    field1, 
    [1], [2], [3], [4] 
FROM 
    (
    SELECT 
    field1, 
    field2, 
    (ROW_NUMBER() OVER(PARTITION BY field1 ORDER BY field2)) RowID 
    FROM tblname 
) AS SourceTable 
PIVOT 
    (
    MAX(field2) 
    FOR RowID IN ([1], [2], [3], [4]) 
) AS PivotTable; 

ऊपर वाक्य रचना शानदार ढंग से काम करता है, लेकिन जब मैं में अतिरिक्त जानकारी के फ़ील्ड 3, फ़ील्ड 4 में पाया करने के लिए की जरूरत है मैं क्या करूँ ....?

+2

बिल्कुल आपको क्या करने की आवश्यकता है? –

+0

कोशिश की, मेरे लिए अच्छा काम (ब्लॉग में तीसरा दृष्टिकोण)। http://dba.stackexchange.com/questions/65786/query-pivot-multiple-columns-variable-number-of-rows – JayaPrakash

उत्तर

11

पुनर्लेखन (मामला ...) और द्वारा समूह:

select 
    field1 
, [1] = max(case when RowID = 1 then field2 end) 
, [2] = max(case when RowID = 2 then field2 end) 
, [3] = max(case when RowID = 3 then field2 end) 
, [4] = max(case when RowID = 4 then field2 end) 
from (
    select 
    field1 
    , field2 
    , RowID = row_number() over (partition by field1 order by field2) 
    from tblname 
) SourceTable 
group by 
    field1 

वहां से आप फ़ील्ड 3, फ़ील्ड 4 में, आदि

+0

मैं जो कर रहा हूं वह इस व्युत्पन्न तालिका को पॉप्युलेट करने के लिए सीटीई में सीएएसई स्टेटमेंट का उपयोग कर रहा था, जिसे मैं अतिरिक्त मानदंडों के साथ शामिल हुआ था। यहाँ CTE है: – websch01ar

+0

cteSec के साथ के रूप में ( \t चयन \t vSec.ID, \t --Secretary 1 ----------------------- - \t मैक्स ( \t \t मामला vSec.RowID \t \t जब 1 तब vSec.field1 \t \t अन्य सभी '' \t \t अंत \t) [SEC_OfficePhone1], \t मैक्स ( \t \t CASE vSec.RowID \t 0 THEN vSec।field2 \t और के \t '' \t \t अंत \t) [SEC_OfficeFax1], \t \t से \t \t चयन टॉप 100 प्रतिशत \t ( \t --This अंदरूनी QUERY (यह सचिवों की जाने वाली पंक्तियां प्रदान करती है किया जाएगा) \t फ़ील्ड 1, field2, आईडी \t \t (ROW_NUMBER() से अधिक (द्वारा vs.ID आदेश द्वारा vs.ID2 PARTITION)) tblname से \t RowID बनाम \t आदेश vs.ID द्वारा आईडी 2 \t) Vsec \t ग्रुप \t vSec.ID ) – websch01ar

+0

द्वारा तो इस विधि के माध्यम से मैं कॉलम मैं उम्मीद कर रहा हूँ की संख्या hardcoded है। मैं आमतौर पर इसे गतिशील रूप से करना पसंद करूंगा, क्योंकि यह बदलने के लिए बाध्य है। लेकिन एक कंपनी के रूप में, हम ओवरहेड कमी पर ध्यान केंद्रित कर रहे हैं, इसलिए मुझे प्रति मालिक चार से अधिक सचिवों की आवश्यकता नहीं दिखाई देती है ... मैं आपको क्रेडिट दे रहा हूं क्योंकि आपकी पोस्ट ने मुझे 20 मामले लिखने के लिए सड़क का नेतृत्व किया बयान। यह एक उप-दूसरे प्रतिक्रिया के साथ एक आकर्षण की तरह काम करता है। – websch01ar

1

यदि आप एमएस एसक्यूएल सर्वर का उपयोग कर रहे हैं, तो मुझे यकीन नहीं है, लेकिन यदि आप हैं ... आप इंजन की क्रॉस एप्पल कार्यक्षमता पर एक नज़र डालना चाहेंगे। असल में यह आपको परिणाम सेट में तालिका-मूल्यवान यूडीएफ के परिणामों को लागू करने की अनुमति देगा। इसके लिए आपको अपनी पिवट क्वेरी को टेबल-मूल्यवान परिणाम सेट में रखना होगा। मैक्स का उपयोग कर

http://weblogs.sqlteam.com/jeffs/archive/2007/10/18/sql-server-cross-apply.aspx

+0

-1 प्रश्न – Andomar

+0

के साथ संबंध नहीं देख सकता प्रश्न टी-एसक्यूएल के रूप में टैग और शीर्षक है । यह एमएस बोली है .... – RolandTumble

+0

यह सिबेज बोली भी है। –

1

जोड़ सकते हैं के साथ अपने एसक्यूएल बयान लपेट कुछ ऐसा:

select a.segment, sum(field2), sum(field3) 
from (original select with case arguments) a 
group by a.segment 

यह आपके परिणामों को एक पंक्ति में पतन करना चाहिए, field1 पर समूहित।

0

एकाधिक कॉलम पर पिवोट करना संभव है, लेकिन आपको एकाधिक पिवटों में पिवट कॉलम का पुन: उपयोग करने के बारे में सावधान रहना होगा। यहाँ इस विषय पर एक अच्छा ब्लॉग पोस्ट है:

http://pratchev.blogspot.com/2009/01/pivoting-on-multiple-columns.html

1

एक ROW_NUMBER साथ इसने कई धुरियाँ कर चाल है कि पंक्ति संख्या अनुक्रम दोनों अनुक्रम और क्षेत्र संख्या स्टोर करने के लिए संशोधित करने के लिए है। यहां एक उदाहरण दिया गया है जो आप कई PIVOT कथन के साथ चाहते हैं।

-- populate some test data 
if object_id('tempdb..#tmp') is not null drop table #tmp 
create table #tmp (
    ID int identity(1,1) not null, 
    MainField varchar(100), 
    ThatField int, 
    ThatOtherField datetime 
) 

insert into #tmp (MainField, ThatField, ThatOtherField) 
select 'A', 10, '1/1/2000' union all 
select 'A', 20, '2/1/2000' union all 
select 'A', 30, '3/1/2000' union all 
select 'B', 10, '1/1/2001' union all 
select 'B', 20, '2/1/2001' union all 
select 'B', 30, '3/1/2001' union all 
select 'B', 40, '4/1/2001' union all 
select 'C', 10, '1/1/2002' union all 
select 'D', 10, '1/1/2000' union all 
select 'D', 20, '2/1/2000' --union all 

-- pivot over multiple columns using the 1.1, 1.2, 2.1, 2.2 sequence trick 
select 
    MainField, 
    max([1.1]) as ThatField1, 
    max([1.2]) as ThatOtherField1, 
    max([2.1]) as ThatField2, 
    max([2.2]) as ThatOtherField2, 
    max([3.1]) as ThatField3, 
    max([3.2]) as ThatOtherField3, 
    max([4.1]) as ThatField4, 
    max([4.2]) as ThatOtherField4 
from 
    (
     select x.*, 
      cast(row_number() over (partition by MainField order by ThatField) as varchar(2)) + '.1' as ThatFieldSequence, 
      cast(row_number() over (partition by MainField order by ThatField) as varchar(2)) + '.2' as ThatOtherFieldSequence 
     from #tmp x 
    ) a 
    pivot (
     max(ThatField) for ThatFieldSequence in ([1.1], [2.1], [3.1], [4.1]) 
    ) p1 
    pivot (
     max(ThatOtherField) for ThatOtherFieldSequence in ([1.2], [2.2], [3.2], [4.2]) 
    ) p2 
group by 
    MainField 
संबंधित मुद्दे