您的 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