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