it-swarm.com.de

TSQL-Pivot ohne Aggregatfunktion

Ich habe so einen Tisch ...

CustomerID   DBColumnName   Data
--------------------------------------
1            FirstName      Joe
1            MiddleName     S
1            LastName       Smith
1            Date           12/12/2009
2            FirstName      Sam
2            MiddleName     S
2            LastName       Freddrick
2            Date           1/12/2009
3            FirstName      Jaime
3            MiddleName     S
3            LastName       Carol
3            Date           12/1/2009

Und ich will das ...

Ist das mit PIVOT möglich?

CustomerID  FirstName   MiddleName          LastName        Date
----------------------------------------------------------------------
1           Joe             S               Smith           12/12/2009
2           Sam             S               Freddrick       1/12/2009
3           Jaime           S               Carol           12/1/2009
105
ctrlShiftBryan

Sie können das MAX-Aggregat verwenden, es würde trotzdem funktionieren. MAX eines Werts = dieser Wert ..

In diesem Fall können Sie sich auch 5-mal selbst bei customerid anmelden und nach dbColumnName pro Tabellenreferenz filtern. Es kann besser klappen.

83
gbn

ja aber warum !!??

   Select CustomerID,
     Min(Case DBColumnName When 'FirstName' Then Data End) FirstName,
     Min(Case DBColumnName When 'MiddleName' Then Data End) MiddleName,
     Min(Case DBColumnName When 'LastName' Then Data End) LastName,
     Min(Case DBColumnName When 'Date' Then Data End) Date
   From table
   Group By CustomerId
138
Charles Bretana

Ok, entschuldige die arme Frage. gbn hat mich auf die richtige Spur gebracht. Das war es, wonach ich in einer Antwort gesucht habe.

SELECT [FirstName], [MiddleName], [LastName], [Date] 
FROM #temp 
PIVOT
(   MIN([Data]) 
    FOR [DBColumnName] IN ([FirstName], [MiddleName], [LastName], [Date]) 
)AS p

Dann musste ich eine while-Anweisung verwenden und die obige Anweisung als varchar erstellen und dynmaic sql verwenden. 

So etwas verwenden

SET @fullsql = @fullsql + 'SELECT ' + REPLACE(REPLACE(@fulltext,'(',''),')','')
SET @fullsql = @fullsql + 'FROM #temp '
SET @fullsql = @fullsql + 'PIVOT'
SET @fullsql = @fullsql + '('
SET @fullsql = @fullsql + ' MIN([Data])'
SET @fullsql = @fullsql + ' FOR [DBColumnName] IN '[email protected]
SET @fullsql = @fullsql + ')'
SET @fullsql = @fullsql + 'AS p'

EXEC (@fullsql)

Erstellen Sie einen @ fulltext mit einer while-Schleife und wählen Sie die unterschiedlichen Spaltennamen aus der Tabelle aus. Danke für die Antworten.

8
ctrlShiftBryan
WITH pivot_data AS
(
SELECT customerid, -- Grouping Column
dbcolumnname, -- Spreading Column
data -- Aggregate Column
FROM pivot2 
)
SELECT customerid, [firstname], [middlename], [lastname]
FROM pivot_data
PIVOT (max(data) FOR dbcolumnname IN ([firstname],[middlename],[lastname])) AS p;
7
mr_eclair
SELECT
main.CustomerID,
f.Data AS FirstName,
m.Data AS MiddleName,
l.Data AS LastName,
d.Data AS Date
FROM table main
INNER JOIN table f on f.CustomerID = main.CustomerID
INNER JOIN table m on m.CustomerID = main.CustomerID
INNER JOIN table l on l.CustomerID = main.CustomerID
INNER JOIN table d on d.CustomerID = main.CustomerID
WHERE f.DBColumnName = 'FirstName' 
AND m.DBColumnName = 'MiddleName' 
AND l.DBColumnName = 'LastName' 
AND d.DBColumnName = 'Date' 

Edit: Ich habe dies ohne Editor geschrieben und die SQL nicht ausgeführt. Ich hoffe, du bekommst die Idee.

6
shahkalpesh

Das OP musste eigentlich nicht ohne Aggregation schwenken, aber für alle, die hierher kommen, um zu erfahren, wie:

sql-parametrisierte cte-Abfrage

Die Antwort auf diese Frage bezieht sich auf eine Situation, in der Pivot ohne Aggregation benötigt wird. Ein Beispiel dafür ist Teil der Lösung.

5
bielawski

Hier können Sie dynamische Felder für eine Pivot-Abfrage erstellen:

--summieren Sie die Werte in eine tmp-Tabelle

declare @STR varchar(1000)
SELECT  @STr =  COALESCE(@STr +', ', '') 
+ QUOTENAME(DateRange) 
from (select distinct DateRange, ID from ##pivot)d order by ID

--- siehe die generierten Felder

print @STr

exec('  .... pivot code ...
pivot (avg(SalesAmt) for DateRange IN (' + @Str +')) AS P
order by Decile')
0
user7237698

Das sollte funktionieren:

select * from (select [CustomerID]  ,[Demographic] ,[Data]
from [dbo].[pivot]
) as Ter

pivot (max(Data) for  Demographic in (FirstName, MiddleName, LastName, [Date]))as bro
0
Randy Boamah

Versuche dies:

SELECT CUSTOMER_ID, MAX(FIRSTNAME) AS FIRSTNAME, MAX(LASTNAME) AS LASTNAME ...

FROM
(

SELECT CUSTOMER_ID, 
       CASE WHEN DBCOLUMNNAME='FirstName' then DATA ELSE NULL END AS FIRSTNAME,
       CASE WHEN DBCOLUMNNAME='LastName' then DATA ELSE NULL END AS LASTNAME,
        ... and so on ...
GROUP BY CUSTOMER_ID

) TEMP

GROUP BY CUSTOMER_ID
0
user3538033