2

すべてのエージェントとそのモジュールを取得するクエリがあり、結果セットはモジュールごとに 1 行を返します。

SELECT
   am.agentID          AS agentid,
   pa.agentDisplayName agentdisplayname,
   m.ModuleName        ModuleName
FROM
   AgentModule AS am
   JOIN primaryagent AS pa
      ON am.agentID = pa.AgentID
   JOIN Module AS m
      ON am.ModuleID = m.ModuleID
WHERE
   m. Active = 1
   AND pa.groupID = 75

データセットは以下のように返されます

エージェント ID | エージェント表示名 | モジュール名
94 | エージェント1 | モジュール 1
94 | エージェント1 | モジュール 2
94 | エージェント1 | モジュール 3
23 | エージェント1 | モジュール 2
23 | エージェント1 | モジュール 3

PIVOT 関数を使用して、より似たテーブルを返そうとしています

エージェント ID | エージェント表示名 | モジュール 1 | モジュール 2 | モジュール 3 |.. .. ..
94 | エージェント1 | 1 | 1 | 1
23 | エージェント2 | 0 | 1 | 1

モジュールの動的リストがあるため、クエリでそれらをハードコーディングすることはできません。私は PICOT を試しましたが、集約関数を期待しているようで、このシナリオに必要なものであるかどうかはよくわかりません。

4

1 に答える 1

3

結果に列を追加し、その列で min() を使用できます。結果は1またはになりますnull。の代わりにisnulla を取得するために使用します。0null

select agentid,
       agentdisplayname,
       isnull([Module 1], 0) as [Module 1],
       isnull([Module 2], 0) as [Module 2],
       isnull([Module 3], 0) as [Module 3]
from
  (
    select agentid, agentdisplayname, modulename, 1 as dummy
    from YourResultset
  ) as T
pivot
  (min(dummy) for modulename in ([Module 1],[Module 2],[Module 3])) as P

これを動的に構築する場合は、最初に結果にあるモジュールを返すクエリを実行する必要があり、次にそれを使用して動的ステートメントを構築する必要があります。クエリの結果を一時テーブルに格納し、動的クエリを作成するときにそのテーブルを使用することをお勧めします。

SELECT
   am.agentID          AS agentid,
   pa.agentDisplayName agentdisplayname,
   m.ModuleName        ModuleName
INTO #Tmp
FROM
   AgentModule AS am
   JOIN primaryagent AS pa
      ON am.agentID = pa.AgentID
   JOIN Module AS m
      ON am.ModuleID = m.ModuleID
WHERE
   m. Active = 1
   AND pa.groupID = 75

を使用して動的クエリを作成して実行します#Tmp

declare @FieldList1 nvarchar(max)
declare @FieldList2 nvarchar(max)
declare @SQL nvarchar(max)

set @FieldList1 =
  (select ',isnull('+quotename(modulename)+', 0) as '+quotename(modulename)
   from #Tmp
   group by modulename
   order by modulename
   for xml path(''), type).value('.', 'nvarchar(max)')

set @FieldList2 = stuff(
  (select ','+quotename(modulename)
   from #Tmp
   group by modulename
   order by modulename
   for xml path(''), type).value('.', 'nvarchar(max)') , 1, 1, '')

set @SQL = 
  'select agentid, agentdisplayname'+@FieldList1+
  'from (select agentid, agentdisplayname, modulename, 1 as dummy 
         from YourTable) as T 
   pivot (min(dummy) for modulename in ('+@FieldList2+')) as P'

exec sp_executesql @SQL

drop table #Tmp
于 2012-04-16T05:53:15.397 に答える