-3

こんにちは、SQL Server で次のクエリを実行して、Datatable を入力する必要があります。

私の場合、3 つのテーブルがあります。

1 - Users
2 - Process
3 - Status

ユーザー

id, name

プロセス

id, cod_user, cod_status

状態

id, status

次のテーブルを返すクエリを作成する必要があります。

ユーザー名 | Status.Created | Status.Opened | Status.Finalized
トム 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

ユーザーごとに 1 つのレコード、ステータスごとに 1 つの列を表示しようとしているように見えますが、列には、そのユーザーのそのステータスを持つ Process テーブル内のレコードの数が含まれていますか?

それが正しい場合は、ピボット テーブルを使用する必要があります。

于 2012-11-12T20:47:48.187 に答える