2012-11-12 53 views
-3

您好我需要在SQL Server中執行以下查詢來填充和Datatable。動態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

你應該[**'Joins' **](http://beginner-sql-tutorial.com/sql-joins.htm) –

+1

其中的那些三步(詢問部,returing表去,填寫數據表)你卡在? –

+0

我被卡住了查詢。我如何構建這個查詢? – mcamara

回答

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