【问题标题】:How to pivot the given structure to expected one?如何将给定的结构转向预期的结构?
【发布时间】:2015-10-01 07:41:17
【问题描述】:

我有图片中的查询结果,同样适用于 90 个日期,因此如何将对象分组并将日期作为列并计数到相应的日期。

提前致谢!!

【问题讨论】:

  • 您的预期结果有问题吗? 201145-01-02?
  • 您可能正在寻找动态支点,或者如果您有固定的日期数量,则只是一个普通支点

标签: sql sql-server tsql pivot pivot-table


【解决方案1】:

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

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]

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-15
      • 1970-01-01
      • 2015-07-04
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-18
      相关资源
      最近更新 更多