2012-05-03 11 views
29

में PIVOT फ़ंक्शन को समझना मैं SQL के लिए बहुत नया हूं।टी-एसक्यूएल

मैं इस तरह एक मेज है:

ID | TeamID | UserID | ElementID | PhaseID | Effort 
----------------------------------------------------- 
1 | 1 | 1  | 3  | 5  | 6.74 
2 | 1 | 1  | 3  | 6  | 8.25 
3 | 1 | 1  | 4  | 1  | 2.23 
4 | 1 | 1  | 4  | 5  | 6.8 
5 | 1 | 1  | 4  | 6  | 1.5 

और मैं इस

ElementID | PhaseID1 | PhaseID5 | PhaseID6 
-------------------------------------------- 
    3  | NULL | 6.74 | 8.25 
    4  | 2.23 | 6.8 | 1.5 

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

उत्तर

40

एक PIVOT में पाया जा सकता उपयोग किया गया डेटा को एक कॉलम से एकाधिक कॉलम में घुमाने के लिए।

अपने उदाहरण यहां की एक स्थिर धुरी आप हार्ड कोड अर्थ कॉलम है कि आप घुमाना चाहते है:

create table temp 
(
    id int, 
    teamid int, 
    userid int, 
    elementid int, 
    phaseid int, 
    effort decimal(10, 5) 
) 

insert into temp values (1,1,1,3,5,6.74) 
insert into temp values (2,1,1,3,6,8.25) 
insert into temp values (3,1,1,4,1,2.23) 
insert into temp values (4,1,1,4,5,6.8) 
insert into temp values (5,1,1,4,6,1.5) 

select elementid 
    , [1] as phaseid1 
    , [5] as phaseid5 
    , [6] as phaseid6 
from 
(
    select elementid, phaseid, effort 
    from temp 
) x 
pivot 
(
    max(effort) 
    for phaseid in([1], [5], [6]) 
)p 

यहाँ एक काम संस्करण के साथ एक SQL Demo है।

यह गतिशील PIVOT के माध्यम से भी किया जा सकता है जहां आप गतिशील रूप से स्तंभों की सूची बनाते हैं और PIVOT निष्पादित करते हैं।

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.phaseid) 
      FROM temp c 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT elementid, ' + @cols + ' from 
      (
       select elementid, phaseid, effort 
       from temp 
      ) x 
      pivot 
      (
       max(effort) 
       for phaseid in (' + @cols + ') 
      ) p ' 


execute(@query) 

दोनों के लिए परिणाम: संगतता त्रुटि

उपयोग

ELEMENTID PHASEID1 PHASEID5 PHASEID6 
3   Null  6.74  8.25 
4   2.23  6.8   1.5 
+1

धन्यवाद यह मिला। QUOTENAME से पहले मुझे केवल हार्ड कोड 'PhaseID' की आवश्यकता है। सही? QUOTENAME में –

+1

आपको यह पहचानना होगा कि आपको कौन से कॉलम से मूल्य प्राप्त करने की आवश्यकता है।क्या आप यही पूछ रहे हैं? – Taryn

+2

ठीक है। समझ गया। धन्यवाद –

5

ये बहुत ही मूल पिवट उदाहरण हैं, कृपया इसके माध्यम से जाएं। उत्पाद तालिका के लिए लिंक ऊपर से

SQL SERVER – PIVOT and UNPIVOT Table Examples

उदाहरण:

SELECT PRODUCT, FRED, KATE 
FROM (
SELECT CUST, PRODUCT, QTY 
FROM Product) up 
PIVOT (SUM(QTY) FOR CUST IN (FRED, KATE)) AS pvt 
ORDER BY PRODUCT 

renders:

PRODUCT FRED KATE 
-------------------- 
BEER  24 12 
MILK  3  1 
SODA NULL  6 
VEG NULL  5 

इसी प्रकार के उदाहरण ब्लॉग पोस्ट Pivot tables in SQL Server. A simple sample

+1

वास्तव में सरल उदाहरण। धन्यवाद :) –

2

सेट करने के लिए इस धुरी समारोह

ALTER DATABASE [dbname] SET COMPATIBILITY_LEVEL = 100 
0
SELECT <non-pivoted column>, 
    [first pivoted column] AS <column name>, 
    [second pivoted column] AS <column name>, 
    ... 
    [last pivoted column] AS <column name> 
FROM 
    (<SELECT query that produces the data>) 
    AS <alias for the source query> 
PIVOT 
(
    <aggregation function>(<column being aggregated>) 
FOR 
[<column that contains the values that will become column headers>] 
    IN ([first pivoted column], [second pivoted column], 
    ... [last pivoted column]) 
) AS <alias for the pivot table> 
<optional ORDER BY clause>; 

USE AdventureWorks2008R2 ; 
GO 
SELECT DaysToManufacture, AVG(StandardCost) AS AverageCost 
FROM Production.Product 
GROUP BY DaysToManufacture; 

    DaysToManufacture   AverageCost 
0       5.0885 
1       223.88 
2       359.1082 
4       949.4105 

    -- Pivot table with one row and five columns 
SELECT 'AverageCost' AS Cost_Sorted_By_Production_Days, 
[0], [1], [2], [3], [4] 
FROM 
(SELECT DaysToManufacture, StandardCost 
    FROM Production.Product) AS SourceTable 
PIVOT 
(
AVG(StandardCost) 
FOR DaysToManufacture IN ([0], [1], [2], [3], [4]) 
) AS PivotTable; 




Here is the result set. 
Cost_Sorted_By_Production_Days 0   1   2   3  4  
AverageCost      5.0885 223.88 359.1082 NULL 949.4105 
2

उपयोग करने से पहले मैं इस और मैं के लिए नया था इसके बारे में एक अच्छी पोस्ट बनाएं ... मेरी समस्या मीटर को समझने था कैसे सही ढंग से लागू करने के लिए एकत्रीकरण और यहाँ मेरी पोस्ट है: http://jaider.net/posts/1176-pivot-in-sql-server-correct-aggregated-results/

@bluefeet समाधान में, ऐसा नहीं है कि elementid अपने "अदृश्य" Group By के प्रमुख स्तंभ है उल्लेख करने के लिए महत्वपूर्ण है। इसके अतिरिक्त, आप elementid को प्रतिस्थापित कर सकते हैं या userid जैसे अधिक कॉलम जोड़ सकते हैं।

enter image description here

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