您好我需要在SQL Server中执行以下查询来填充和数据表。
在我的情况下,我有3个表:
1 - Users
2 - Process
3 - Status
用户
id, name
过程
id, cod_user, cod_status
状态
id, status
我需要创建一个返回以下表的查询:
User.Name | Status.Created | Status.Opened | Status.Finalized Tom 50 30 20 Roger 22 33 44 Kris 11 09 05
然后,我必须返回此表来填充和数据表。
...谢谢
答案 0 :(得分:1)
看起来您正在尝试PIVOT
数据,如果您知道要转换的status
的值,则可以使用类似的内容:
select name, [Created], [Opened], [Finalized]
from
(
select u.name,
s.status
from users u
left join process p
on u.id = p.cod_user
left join status s
on p.cod_status = s.id
) src
pivot
(
count(status)
for status in ([Created], [Opened], [Finalized])
) piv
如果你有一个未知数量的状态变成列,那么你可以使用动态sql:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(status)
from status
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT name, ' + @cols + ' from
(
select u.name,
s.status
from users u
left join process p
on u.id = p.cod_user
left join status s
on p.cod_status = s.id
) x
pivot
(
count(status)
for status in (' + @cols + ')
) p '
execute(@query)
如果您无权访问PIVOT
函数,则可以使用聚合函数和CASE
语句复制它:
select u.name,
sum(case when s.status = 'created' then 1 else 0 end) created,
sum(case when s.status = 'opened' then 1 else 0 end) opened,
sum(case when s.status = 'finalized' then 1 else 0 end) finalized
from users u
left join process p
on u.id = p.cod_user
left join status s
on p.cod_status = s.id
group by u.name
答案 1 :(得分:0)
看起来您正在尝试为每个用户显示一条记录,每个状态一列,并且列包含Process表中具有该用户状态的记录数?
如果这是正确的,那么你想使用数据透视表。