Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于填充数据表的动态SQL Server查询_C#_Sql_Sql Server - Fatal编程技术网

C# 用于填充数据表的动态SQL Server查询

C# 用于填充数据表的动态SQL Server查询,c#,sql,sql-server,C#,Sql,Sql Server,您好,我需要在SQLServer中执行以下查询以填充和数据表 就我而言,我有3个表: 1 - Users 2 - Process 3 - Status 使用者 过程 id, cod_user, cod_status 地位 id, status 我需要进行一个查询,返回下表: User.Name | Status.Created | Status.Opened | Status.Finalized 汤姆50 30 20 罗杰22344 克里斯11 09 05 然后,我必须返回这个表来填充数据

您好,我需要在SQLServer中执行以下查询以填充和数据表

就我而言,我有3个表:

1 - Users
2 - Process
3 - Status
使用者

过程

id, cod_user, cod_status
地位

id, status
我需要进行一个查询,返回下表:

User.Name | Status.Created | Status.Opened | Status.Finalized 汤姆50 30 20 罗杰22344 克里斯11 09 05 然后,我必须返回这个表来填充数据表


谢谢…

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


如果这是正确的,那么您需要使用透视表。

看起来您正在尝试透视数据,如果您知道要转换的
状态的值,您可以使用类似的方法:

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

您应该继续执行这三个步骤(查询、检索表、填充数据表)中的哪一部分?我一直在查询。如何生成此查询?是否要填充视图?您正在搜索替代触发器吗?可能是一个视图或直接构建一个查询。
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)
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