2017-06-27 3 views
0

Ich habe diese Art von Daten: ORIGINAL DATASQL Server Pivot Sum Daten

Ich möchte Bericht wie folgt zu erzeugen. NEED DATA

Wie ist es möglich für mich mit SQL Server.

+2

Bitte zeigen Sie Daten und Code als formatierten Text an, nicht als (Link zu) Bild. Hast du irgendwas versucht? – HoneyBadger

+0

Ja. Ich versuche Pivot, nicht korrekte Daten. –

+0

@KETULSONI - Veröffentlichen Sie den Code, den Sie bisher versucht haben –

Antwort

0

Sie können dies verwenden.

DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX); 
SET @columns = N''; 
SELECT @columns += N', ' + QUOTENAME(Process) 
    FROM 
    (
    SELECT DISTINCT Process FROM SAMPLE_TABLE 
) AS x; 
SET @sql = N'SELECT [Date],' 
+ STUFF(@columns, 1, 2, '') 
+ 'FROM 
(

SELECT [Date], Qty,Process FROM SAMPLE_TABLE 

) AS j PIVOT 
(
    SUM(Qty) FOR Process IN (' 
    + STUFF(REPLACE(@columns, ', [', ',['), 1, 1, '') 
    + ') 
) AS p ORDER BY p.[Date];'; 
EXEC sp_executesql @sql; 
0

mit Dreh nicht die Mühe machen, wenn es immer diese vier Optionen ist ... Verwenden Sie ein bedingter Aggregat

select Date, 
    sum(case when Process = 'DESIGN' then Qty else 0 end) as DESIGN, 
    sum(case when Process = 'CODING' then Qty else 0 end) as CODING, 
    sum(case when Process = 'TESTING' then Qty else 0 end) as TESTING, 
    sum(case when Process = 'DATABASE' then Qty else 0 end) as [DATABASE] 
from MyTable 
group by Date 
0

Wir können das gewünschte Ergebnis durch Verwendung von dynamischem SQL

IF OBJECT_ID('Tempdb..#Temp') IS NOt NUll 
Drop Table #Temp 
;With cte (Developer, Process ,Qty, Date) 
AS 
(
SELECT 'XYZ','Design', 10  ,'26/06/2017' Union all 
SELECT 'XYZ','Codein', 20 ,'26/06/2017' Union all 
SELECT 'XYZ','Testin', 30 ,'26/06/2017' Union all 
SELECT 'XYZ','Databa', 40 ,'26/06/2017' Union all 
SELECT 'ABC','Design', 10  ,'26/06/2017' Union all 
SELECT 'ABC','Codein', 20 ,'26/06/2017' Union all 
SELECT 'ABC','Testin', 30 ,'26/06/2017' Union all 
SELECT 'ABC','Databa', 40 ,'27/06/2017' Union all 
SELECT 'XYZ','Design', 50  ,'27/06/2017' Union all 
SELECT 'XYZ','Codein', 60 ,'27/06/2017' Union all 
SELECT 'XYZ','Testin', 70 ,'27/06/2017' Union all 
SELECT 'XYZ','Databa', 80 ,'27/06/2017' Union all 
SELECT 'ABC','Design', 50  ,'27/06/2017' Union all  
SELECT 'ABC','Codein', 60 ,'27/06/2017' Union all 
SELECT 'ABC','Testin', 70 ,'27/06/2017' Union all 
SELECT 'ABC','Databa', 80 ,'27/06/2017' 
) 
SELECT * INTO #Temp FROM cte 

--Above i have created sample data for getting result 

DECLARE @dynamicCol nvarchar(max), 
     @Sql nvarchar(max), 
     @dynamicCol2 nvarchar(max), 
     @dynamicCol3 nvarchar(max) 

SELECT @dynamicCol=STUFF((SELECT DISTINCT ', ' + 'ISNULL('+Process +',''0'') AS '+ Process FROM #Temp 
FOR XML PATH('')),1,1,'') 

SELECT @dynamicCol2=STUFF((SELECT DISTINCT ', ' + Process FROM #Temp 
FOR XML PATH('')),1,1,'') 

SELECT @dynamicCol3=STUFF((SELECT DISTINCT ', ' + 'SUM('+Process +') OVER(Partition by [Date]) AS '+ Process FROM #Temp 
FOR XML PATH('')),1,1,'') 



SET @Sql='SELECT DISTINCT [Date],'[email protected]+' FROM 
      (
      SELECT [Date] , '+ @dynamicCol +' From 
      (
      SELECT * From 
      #temp 
      )AS Src 
      PIVOT 
      (
      MAX([Qty]) For [Process ] IN ('[email protected]+') 
      ) 
      AS Pvt 
      )DT 
      ' 

PRINT @Sql 

EXEC(@Sql) 
0

Wenn Sie nicht möchten, dass eine bestimmte Pivot- und Ergebnisansicht erwähnt wird, sondern Daten verwendet werden sollen, als

select Date1,cast(Process as varchar(200)) Status,sum(Qty) as Count from #temp group by Date1,Process