Aggregatfunktion innerhalb der inneren Auswahl in Pivot-Abfrage unter Verwendung von SQL server

Ich habe die folgende Tabelle:

select * from product; slno item --------------- 1 HDD 2 PenDrive 3 RAM 4 DVD 5 RAM 6 HDD 7 RAM 7 RAM 7 RAM 

Jetzt muss ich für diese Tabelle schwenken, für die ich folgende Abfrage verwende:

 DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) select @cols = STUFF((SELECT ',' + QUOTENAME(item) from product group by item order by item FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'') set @query = 'SELECT slno,TotalProduct ,' + @cols + ' from ( select slno,Count(*) as TotalProduct,item from product group by slno,item ) x pivot ( count(item) for item in (' + @cols + ') ) p ' exec(@query) 

Ergebnis:

  slno TotalProducts DVD HDD PenDrive RAM --------------------------------------------- 1 1 0 1 0 0 2 1 0 0 1 0 3 1 0 0 0 1 4 1 1 0 0 0 5 1 0 0 0 1 6 1 0 1 0 0 7 3 0 0 0 1 

Anmerkung Die Summe des Produkt-RAM ist 3 aber in der Spalte RAM, die nur 1. Ich habe COUNT(*) Aggregat-function innerhalb der inneren select-statement in @query . Wie kann ich die tatsächliche Anzahl anzeigen?

Du musst nur durch slno , nicht durch die Kombination von slno und item . Daher müssen Sie die Abfrage ändern, die eine Quelle für Ihren Pivot wie folgt bietet:

 set @query = 'SELECT slno,totalproduct,' + @cols + ' from ( select p.slno slno, c.count as totalproduct, p.item from product p inner join (select slno, count(item) count from product group by slno) c on p.slno = c.slno ) x pivot ( count(item) for item in (' + @cols + ') ) p ' 

Demo

Verwenden Sie folgende Unterabfrage anstelle Ihrer Unterabfrage:

 select slno,Count(*) OVER (PARTITION BY slno) as TotalProduct,item from product 

Bearbeiten: Count(*) Over(Partition by ...) unterstützt in SQL server 2012 und über Versionen.