Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server数据透视和_Sql_Sql Server - Fatal编程技术网

SQL Server数据透视和

SQL Server数据透视和,sql,sql-server,Sql,Sql Server,我有这类数据: 我想生成这样的报告。 我如何使用sql server。您可以使用它 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

我有这类数据:

我想生成这样的报告。

我如何使用sql server。

您可以使用它

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;

如果pivot始终是这4个选项,那么就不用担心了。。。使用条件聚合

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

通过使用动态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],'+@dynamicCol3+' FROM
            (
            SELECT  [Date] , '+ @dynamicCol +' From
            (
            SELECT * From
            #temp
            )AS Src
            PIVOT 
            (
            MAX([Qty]) For [Process ] IN ('+@dynamicCol2+')
            )
            AS Pvt
            )DT
            '

PRINT @Sql

EXEC(@Sql)

如果您不需要所提到的特定透视图和结果视图,但需要数据,请参阅下文

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

请将数据和代码显示为格式化文本,而不是(链接到)图像。你试过什么吗?是的。我尝试的是Pivot,不是正确的数据。@KETULSONI-发布您迄今为止尝试过的代码是否始终使用相同的4个选项(设计、编码、测试、数据库)?没有列是动态的。谢谢你,约翰