2015-07-13 79 views
1

我有图像查询结果,类似于90日期,所以如何将对象分组并将日期作为列并计入各自的日期。如何将给定结构转换为预期结构?

enter image description here

在此先感谢!

+0

出错了预期的效果? 201145-01-02? –

+0

您可能正在寻找一个动态数据透视表,或者只是一个正常的数据,如果您有固定的日期数 –

+0

可能dublicate:http://stackoverflow.com/questions/30295640/how-to-return-dynamic-columns- from-grouped-values-in-sql-server-stored-proceduresur/30297102#30297102 – CeOnSql

回答

2

可以使用动态交叉做到这一点:

SQL Fiddle

DECLARE @sql1 VARCHAR(4000) = '' 
DECLARE @sql2 VARCHAR(4000) = '' 
DECLARE @sql3 VARCHAR(4000) = '' 

SELECT @sql1 = 
'SELECT 
    [Object]' + CHAR(10) 

SELECT @sql2 = @sql2 + 
' , MAX(CASE WHEN [Date] = CAST(''' + CONVERT(VARCHAR(8), [Date], 112) + ''' AS DATE) THEN [count] END) AS ' + QUOTENAME([Date]) + CHAR(10) 
FROM(
    SELECT DISTINCT [Date] FROM tbl 
)t 
ORDER BY [Date] 

SELECT @sql3 = 
'FROM tbl 
GROUP BY [Object] 
ORDER BY [Object]' 

PRINT(@sql1 + @sql2 + @sql3) 
EXEC (@sql1 + @sql2 + @sql3) 

结果

| Object | 2015-01-01 | 2015-01-02 | 
|--------|------------|------------| 
|  1 |   10 |   34 | 
|  2 |   20 |   46 | 
|  3 |  130 |   78 | 
|  4 |   40 |   89 | 
|  5 |   55 |   45 | 

这是PRINT命令的输出:

SELECT 
    [Object] 
    , MAX(CASE WHEN [Date] = CAST('20150101' AS DATE) THEN [count] END) AS [2015-01-01] 
    , MAX(CASE WHEN [Date] = CAST('20150102' AS DATE) THEN [count] END) AS [2015-01-02] 
FROM tbl 
GROUP BY [Object] 
ORDER BY [Object] 
+0

这对我有用。 –

2

您可以使用SQL Server PIVOT关系运算符

DECLARE @SQLQuery AS NVARCHAR(MAX) 
DECLARE @PivotColumns AS NVARCHAR(MAX) 

--Get unique values of pivot column 
SELECT @PivotColumns= COALESCE(@PivotColumns + ',','') + QUOTENAME([Date]) 
FROM (SELECT DISTINCT [Date] FROM [dbo].[PivotExample]) AS PivotExample 



--Create the dynamic query with all the values for 
--pivot column at runtime 
SET @SQLQuery = 
    N'SELECT ObjectId, ' + @PivotColumns + ' 
    FROM [dbo].[PivotExample] 
    PIVOT(SUM(COUNT) 
      FOR [Date] IN (' + @PivotColumns + ')) AS P' 


EXEC sp_executesql @SQLQuery