动态SQL Server查询以填充DataTable

时间:2012-11-12 17:46:00

标签: c# sql sql-server

您好我需要在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

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

...谢谢

2 个答案:

答案 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表中具有该用户状态的记录数?

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