-3

您好我需要在 SQL Server 中执行以下查询来填充和 Datatable。

就我而言,我有 3 张桌子:

1 - Users
2 - Process
3 - Status

用户

id, name

过程

id, cod_user, cod_status

地位

id, status

我需要进行一个返回下表的查询:

用户名 | 状态。已创建 | 状态。已打开 | 状态.完成
汤姆 50 30 20
罗杰 22 33 44
克里斯11 09 05

然后,我必须返回这个表来填充和数据表。

谢谢...

4

2 回答 2

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
于 2012-11-12T20:53:45.750 回答
0

看起来您正在尝试为每个用户显示一条记录,每个状态有一列,并且这些列包含 Process 表中该用户具有该状态的记录数?

如果这是正确的,那么您想使用数据透视表。

于 2012-11-12T20:47:48.187 回答