2017-03-07 16 views
8

सभी मैं चाहता हूँ इस को बदलने के लिए हैदिखाएँ एसक्यूएल परिणाम

Department | 201601 Print | 201601 Copy | 201602 Print | 201602 Copy | 201603 Print | 201603 Copy 
------------------------------------------------------------------------------------------ 
Dept 1  | 10   | 20   | 30   | 40   | 50   | 60 
Dept 2  | 20   | 10   | 40   | 30   | 60   | 50 

मैं PIVOT साथ स्क्रिप्ट का निर्माण करने की कोशिश कर रहा था, लेकिन मैं पता नहीं कैसे कॉलम में प्रत्येक अवधि के "प्रिंट" और "कॉपी" दोनों को दिखाने के लिए। इसके अलावा, चूंकि 'अवधि' के मान अज्ञात होंगे इसलिए मैं स्क्रिप्ट में मूल्य को हार्ड-कोड भी नहीं कर सकता।

SELECT [Department] 
    ,[201601] AS [201601 Copy] 
    ,[201602] AS [201602 Copy] 
    ,[201603] AS [201603 Copy] 
FROM 
    (SELECT [Copy], [Period], [Department] from #tempTable) AS ST 
PIVOT 
    (SUM([Copy]) FOR [Period] IN ([201601],[201602],[201603])) AS PT 

और यहाँ मेरे नमूना डेटा के साथ तालिका बनाने के लिए स्क्रिप्ट है:

IF OBJECT_ID('tempdb..#tempTable') IS NOT NULL 
    DROP TABLE #tempTable 
CREATE TABLE #tempTable(
    [Period] varchar(50) 
    ,[Department] varchar(50) 
    ,[Print] int 
    ,[Copy] int 
) 
INSERT INTO #tempTable VALUES 
    ('201601', 'Dept 1', 10, 20) 
    ,('201601', 'Dept 2', 20, 10) 
    ,('201602', 'Dept 1', 30, 40) 
    ,('201602', 'Dept 2', 40, 30) 
    ,('201603', 'Dept 1', 50, 60) 
    ,('201603', 'Dept 2', 60, 50) 

पहले से कोई उत्तर के लिए धन्यवाद

यहाँ मेरी प्रयास है।

उत्तर

मुझे प्राप्त जवाब का अध्ययन किया और अंत में नीचे स्क्रिप्ट का निर्माण:

DECLARE @sql AS varchar(max); 
SELECT @sql = 'SELECT [Department],' + 
    STUFF((
     SELECT DISTINCT 
      ',SUM(ISNULL(CASE [Period] WHEN ''' + [Period] + ''' THEN [Print] END, 0)) AS [' + [period] + ' Print]' + 
      ',SUM(ISNULL(CASE [Period] WHEN ''' + [Period] + ''' THEN [Copy] END, 0)) AS [' + [period] + ' Copy]' 
     FROM #TempTable 
     FOR XML PATH('') 
    ), 1, 1, '') + 
    'FROM #TempTable 
    GROUP BY [Department]'; 
PRINT @sql 
EXEC(@sql); 
+1

एक स्प्रेडशीट के लिए एक सतही समानता के बावजूद, एसक्यूएल टेबल बहुत अलग जानवरों रहे हैं - पंक्तियों और स्तंभों आम तौर पर परस्पर विनिमय नहीं कर रहे हैं। यदि यह पूरी तरह से * प्रस्तुति * उद्देश्यों के लिए है, तो यह प्रस्तुति/रिपोर्ट परत में ऐसा करना बेहतर होगा, डेटाबेस नहीं। –

+0

अपना उत्तर इस प्रकार पोस्ट करें - एक उत्तर दें और अगर आपको लगता है कि कोई भी प्रस्तावित उत्तर आपकी समस्या हल नहीं करता है (बेहतर)। –

उत्तर

5

आप एक गतिशील एसक्यूएल क्वेरी का उपयोग कर सकते हैं।

क्वेरी

declare @sql as varchar(max); 
select @sql = 'select [Department],' + stuff((
    select distinct ',max(case [Period] when ' + char(39) + [Period] + char(39) + 
    ' then [Print] end) [' + [period] + ' Print]' 
    + ',max(case [Period] when ' + char(39) + [Period] + char(39) + 
    ' then [Copy] end) [' + [period] + ' Copy]' 
    from #TempTable 
    for xml path('') 
), 1, 1, ''); 

select @sql += ' from #TempTable group by [Department];'; 
exec(@sql); 
+0

एक आकर्षण की तरह काम करता है, बहुत धन्यवाद। मैंने थोड़ा सा संपादित किया है और मेरे प्रश्न में मेरी अंतिम लिपि दिखायी है। – pblyt

0

आप इस IsNull का उपयोग कर() और SUM() कार्य को प्राप्त कर सकते हैं।

SELECT [Department] 
     ,SUM(ISNULL(CASE WHEN [Period]='201601' THEN [Print] END,0)) AS [201601 Print] 
     ,SUM(ISNULL(CASE WHEN [Period]='201601' THEN Copy END,0)) AS [201601 Copy] 
     ,SUM(ISNULL(CASE WHEN [Period]='201602' THEN [Print] END,0)) AS [201602 Print] 
     ,SUM(ISNULL(CASE WHEN [Period]='201602' THEN Copy END,0)) AS [201602 Copy] 
     ,SUM(ISNULL(CASE WHEN [Period]='201603' THEN [Print] END,0)) AS [201603 Print] 
     ,SUM(ISNULL(CASE WHEN [Period]='201603' THEN Copy END,0)) AS [201603 Copy]    
FROM #tempTable 
GROUP BY [Department] 
+0

आपकी स्वच्छ और सरल क्वेरी के लिए धन्यवाद, हालांकि अवधि मान अज्ञात होंगे, जो गतिशील एसक्यूएल का उपयोग करने की आवश्यकता है। – pblyt

+0

उस स्थिति में आप @Ullas कोड का उपयोग कर सकते हैं !!! – balaji

0
SELECT Department,SUM([201601Print])[201601 Print],SUM([201601Copy])[201601 Copy],SUM([201602Print])[201602 Print], 
       SUM([201602Copy])[201602 Copy],SUM([201603Print])[201603 Print],SUM([201603Copy])[201603 Copy] FROM (
SELECT [Department] 
,[201601] AS [201601Copy] 
,[201602] AS [201602Copy] 
,[201603] AS [201603Copy] 
,0 AS [201601Print] 
,0 AS [201602Print] 
,0 AS [201603Print] 
FROM 
(SELECT [Period],[Copy], [Department] from #tempTable) AS ST 
PIVOT 
(SUM([Copy]) FOR [Period] IN ([201601],[201602],[201603])) AS PT 
UNION ALL 
SELECT [Department] 
,0 AS [201601Copy] 
,0 AS [201602Copy] 
,0 AS [201603Copy] 
,[201601] AS [201601Print] 
,[201602] AS [201602Print] 
,[201603] AS [201603Print] 
FROM 
(SELECT [Period],[Print], [Department] from #tempTable) AS ST 
PIVOT 
(SUM([Print]) FOR [Period] IN ([201601],[201602],[201603])) AS PT 
)A GROUP BY Department 
5

एक धुरी का उपयोग करता है एक और गतिशील एसक्यूएल।
लेकिन यह कॉलम नामों के साथ एक स्ट्रिंग उत्पन्न करने के लिए एक चर @ कॉलम का उपयोग करता है।

declare @Columns varchar(max); 
set @Columns = STUFF((SELECT ', ' + QUOTENAME([Period] +' Print') + ', ' + QUOTENAME([Period] +' Copy') FROM #tempTable GROUP BY [Period] FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(max)') ,1,1,''); 

declare @SQL varchar(max); 
set @SQL = 'select * 
from (
select [Department], [Period] + '' Print'' as Title, [Print] as Value from #tempTable 
union all 
select [Department], [Period] + '' Copy'' as Title, [Copy] as Value from #tempTable 
) q 
pivot (sum(Value) for Title in ('+ @Columns +')) p;'; 

--select @SQL; 
exec (@SQL); 
+0

धन्यवाद @ लुकस्टॉर्म आपके साफ जवाब के लिए, लेकिन खेद है कि मैंने उल्लास का जवाब चुना जो केवल 1 चर का उपयोग करता है। इच्छा है कि मैं दोनों जवाब के रूप में चुन सकता हूं! – pblyt

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