0
select *
from (
  select vtid, convert(date, dtime) as Date from Transaction_tbl where locid = 5
) as vt
pivot (
  count(vtid)
  for vtid in (select vtid from VType_tbl)
) as pvt

执行此查询时出现错误

关键字 'select' 附近的语法不正确。”和 ')' 附近的语法不正确。

实际上我还有一个表,name= Vtype_table,如何在这个查询中从 vtype 表中加载所有 vtid?我想获得取决于 vtid 的输出。非常感谢任何帮助。

4

1 回答 1

1

您的 PIVOT 语法是正确的,除非您在 PIVOT 中使用 SELECT 语句。

您不能在 PIVOT IN 子句中使用 SELECT 语句来选择列标题。在执行查询之前,需要知道 IN 子句的列。

如果要生成动态vtid值列表,则需要使用动态 SQL 来获取结果,语法类似于以下内容:

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(vtid) 
                    from VType_tbl
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT Date, ' + @cols + ' 
            from 
            (
                select vtid, convert(date, dtime) as Date 
                from Transaction_tbl 
                where locid = 5 
            ) d
            pivot 
            (
                count(vtid)
                for vtid in (' + @cols + ')
            ) p '

execute(@query);

编辑,如果您希望显示类型名称,那么您应该能够使用以下内容:

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(vt_name) 
                    from VType_tbl
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT Date, ' + @cols + ' 
            from 
            (
                select v.vt_name, convert(date, dtime) as Date 
                from Transaction_tbl t
                inner join VType_tbl v
                  on t.vtid = v.vtid
                where locid = 5 
            ) d
            pivot 
            (
                count(vt_name)
                for vt_name in (' + @cols + ')
            ) p '

execute(@query)

注意:我猜测的列名VType_tbl

于 2013-06-18T11:22:05.337 回答