SQL Server数据透视和
我有这类数据: 我想生成这样的报告。 我如何使用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
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个选项(设计、编码、测试、数据库)?没有列是动态的。谢谢你,约翰