【问题标题】:SQL Static and Dynamic Pivot not workingSQL 静态和动态数据透视不起作用
【发布时间】:2016-01-28 22:06:36
【问题描述】:

我想对列中的所有唯一条目执行此查询。 (创建一个基本的数据透视摘要)(有 160 个唯一值)

   SELECT CAST(Log_Local_Stamp as date) AS ForDate,
   DATEPART(hour,Log_Local_Stamp) AS OnHour,
   DATEPART(minute,Log_Local_Stamp) AS OnMinute,
   DATEPART(second,Log_Local_Stamp) AS OnSecond,
   COUNT(*) AS Totals
   FROM MainView

   GROUP BY CAST(Log_Local_Stamp as date),
   DATEPART(hour,Log_Local_Stamp),
   DATEPART(minute,Log_Local_Stamp),
   DATEPART(second,Log_Local_Stamp) ORDER BY ForDate 

现在有两种方法可以做到这一点:静态枢轴和动态枢轴。我使用了一些代码来生成静态数据透视调用,但是两个调用都失败了。

    SELECT *
    from 
    (
    SELECT 
    CAST(Log_Local_Stamp as date) AS ForDate,
    DATEPART(hour,Log_Local_Stamp) AS OnHour,
    DATEPART(minute,Log_Local_Stamp) AS OnMinute,
    DATEPART(second,Log_Local_Stamp) AS OnSecond,
    COUNT(*) AS Totals
    FROM MainView

    WHERE DATEPART(hour,Log_Local_Stamp) BETWEEN 10 and 13 and               CAST(Log_Local_Stamp as date) = '2015-12-09'

   GROUP BY CAST(Log_Local_Stamp as date),
   DATEPART(hour,Log_Local_Stamp),
   DATEPART(minute,Log_Local_Stamp),
   DATEPART(second,Log_Local_Stamp) ) as ps

   Pivot
   (
   sum(Totals) FOR MainView.Log_Machine_Name IN (Properly formatted list    here)
    ) as piv

这里收到的错误是“列前缀'MainView'与查询中使用的表名或别名不匹配。”,在倒数第二行。不知道为什么会这样。

我的第二种方法是使用动态轴

     DECLARE @cols as NVARCHAR(MAX),
     @query AS NVARCHAR(MAX)

     select @cols = STUFF((SELECT distinct ',' 
     + QUOTENAME(Ltrim(rtrim(Log_Machine_Name))) 
                from MainView
        FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'')

    set @query = 
    'SELECT CAST(Log_Local_Stamp as date) AS ForDate,
    DATEPART(hour,Log_Local_Stamp) AS OnHour,
    DATEPART(minute,Log_Local_Stamp) AS OnMinute,
    DATEPART(second,Log_Local_Stamp) AS OnSecond,
    COUNT(*) AS Totals ' + @cols + '
    FROM (MainView
    GROUP BY CAST(Log_Local_Stamp as date),
    DATEPART(hour,Log_Local_Stamp),
    DATEPART(minute,Log_Local_Stamp),
   DATEPART(second,Log_Local_Stamp) ORDER BY ForDate ) x
   pivot
   (
    SUM(COUNT(*)) for Log_Machine_Name in (' + @cols + ')
    ) p '
execute(@query)

但是,它在第​​ 5 行的“来自 Log_Machine_Name 的数据”附近出现错误语法。 不太清楚如何解决这种情况。

谢谢

【问题讨论】:

  • 请标记或提及 RDMS。这看起来像 SQL Server。 SQL 是一种具有多种方言的共享语言。

标签: sql sql-server-2008 pivot


【解决方案1】:

STATIC QUERY :您正在引用子查询中的列,但您使用的别名是针对表本身而不是针对子查询中的实例,这可能会有所帮助。

SELECT *
from 
(
SELECT 
CAST(Log_Local_Stamp as date) AS ForDate,
DATEPART(hour,Log_Local_Stamp) AS OnHour,
DATEPART(minute,Log_Local_Stamp) AS OnMinute,
DATEPART(second,Log_Local_Stamp) AS OnSecond,
COUNT(*) AS Totals
FROM MainView

WHERE DATEPART(hour,Log_Local_Stamp) BETWEEN 10 and 13 and
CAST(Log_Local_Stamp as date) = '2015-12-09'

GROUP BY CAST(Log_Local_Stamp as date),
DATEPART(hour,Log_Local_Stamp),
   DATEPART(minute,Log_Local_Stamp),
   DATEPART(second,Log_Local_Stamp) ) as ps

   Pivot
   (
   sum(Totals) FOR ps.Log_Machine_Name IN (Properly formatted list    here)
    ) as piv

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 2014-10-16
    • 2010-12-28
    • 2014-07-26
    相关资源
    最近更新 更多