将列转换为行时无法自动从另一个表中获取值

时间:2013-06-18 11:18:00

标签: sql sql-server pivot

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。 非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

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

您不能在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

的列名