2012-06-11 12 views
5

को देखते हुए यहां दो नमूना टेबल्स:एसक्यूएल: स्रोत तालिका में कॉलम मूल्यों पर आधारित स्तंभ नाम के साथ गतिशील दृश्य

टिकट टेबल

ID User Description 

0 James This is a support ticket 
1 Fred This is a ticket too 

गुण तालिका

ID TicketID Label   Value 

0 0   Engineer  Scott 
1 1   Engineer  Dale 
2 0   Manu   Dell 
3 1   Manu   HP 
4 0   OS    Windows 
5 1   OS    Linux 

मैं इस तरह के दृश्य पर कैसे पहुंच सकता हूं:

ID User Description     Engineer Manu OS 

1 James This is a support ticket Scott  Dell Windows 
2 Fred This is a ticket too  Dale  HP  Linux 

यह ध्यान रखें कि गुण तालिका हमेशा एक ही नहीं होगा महत्वपूर्ण है। कुछ "टिकट" में गुण हो सकते हैं जो दूसरों को नहीं करते हैं।

क्या यह भी संभव है?

+2

संपत्ति तालिका शैतान हैं। –

+0

@ जेरेमी इसलिए कॉलम नामों के रूप में संपत्ति नामों को हार्ड-कोडिंग कर सकते हैं। दोनों की जगह है। –

+0

@AaronBertrand, एक बार फिर से मैं आपके साथ सहमत नहीं नहीं ... लेकिन हर बार जब मैं संपत्ति तालिकाओं का उपयोग करने के लिए है मैं लगभग हमेशा प्रदर्शन के मुद्दों है, और वे आमतौर पर धुरी के लिए बट में एक दर्द कर रहे हैं। –

उत्तर

11

आप एक PIVOT के साथ इस प्रदर्शन कर सकते हैं। PIVOT करते समय आप इसे दो तरीकों में से एक कर सकते हैं, एक स्टेटिक पिवट के साथ आप पंक्तियों को बदलने के लिए पंक्तियों को कोड करेंगे या गतिशील पिवट जो रन-टाइम पर कॉलम की सूची बनाएंगे:

स्टेटिक पिवट (देखें SQL Fiddle for Demo):

select id, [user], [engineer], [manu], [OS] 
from 
(
    select t.id 
     , t.[user] 
     , p.ticketid 
     , p.label 
     , p.value 
    from tickets t 
    inner join properties p 
     on t.id = p.ticketid 
) x 
pivot 
(
    min(value) 
    for label in ([engineer], [manu], [OS]) 
) p 

या आप एक गतिशील धुरी (SQL Fiddle for Demo देखें) का उपयोग कर सकते हैं:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX); 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(p.label) 
        from tickets t 
        inner join properties p 
         on t.id = p.ticketid 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT id, [user], ' + @cols + ' from 
      (
       select t.id 
         , t.[user] 
         , p.ticketid 
         , p.label 
         , p.value 
        from tickets t 
        inner join properties p 
         on t.id = p.ticketid 
      ) x 
      pivot 
      (
       min(value) 
       for label in (' + @cols + ') 
      ) p ' 

execute(@query) 

दोनों क्वेरी समान परिणाम देगी।

+0

आपका पहला उदाहरण सटीक एक ही परिणाम के साथ मेरी तुलना में काफी जटिल है, और दूसरा ... गतिशील एसक्यूएल? उस मार्ग पर जाने से पहले, मुझे लगता है कि आप यह सुनिश्चित करना चाहते हैं कि यह एक आवश्यकता है और तालिका का उपभोग कैसे किया जा रहा है। –

+0

आप मेरा नया नायक हैं। मैं आपके बच्चे पैदा करना चाहती हूँ। (मैं कैसे की जरूरत है गतिशील धुरी बिल्कुल काम करता है) –

+1

@JeremyHolovacs मैं सहमत नहीं है कि पहले और अधिक जटिल 3 बाईं के साथ अपने संस्करण में शामिल की तुलना में है। जहां तक ​​गतिशील संस्करण, ओपी ने एक क्वेरी के एक गतिशील संस्करण का अनुरोध किया जो लचीला होगा और यही वह है जो मैंने प्रदान किया था। किसी प्रश्न का उत्तर देने के हमेशा अन्य तरीके हैं, एक और गतिशील तरीके से सुझाव देने के लिए स्वतंत्र महसूस करें। :) – Taryn