2

pageno int、groupid varchar(10) で構成されるテーブルがあります。表の各行は個別です。複数の groupid と pageno の組み合わせが存在する可能性があります。pagenos の量は不明であり、groupids の量は不明です。データは次のようになります。

pageno groupid
101105 mpadilla
101105 gentry
100100 mpadilla
100100 gentry

pagenos を列として、groupid を行として、それらが交差する x を示す結果セットを返したいと思います (その pageno/groupid コンボに存在することを意味します)。

これにはSQLピボットを使用しますか? もしそうなら、私に例を教えてください。そうでない場合は、例と説明を提供してください。私は少し混乱しています。

4

2 に答える 2

2

あなたの要件は完全に明確ではありませんが、私があなたの質問を理解していれば、PIVOT関数を使用して結果を得ることができます。

の数が限られている場合、クエリのこのクエリの基本的な構文は次のようになりますpagenos

select groupid, [101105], [100100]
from
(
  select pageno, groupid, 
    flag = 'X'
  from yourtable
) d
pivot
(
  max(flag)
  for pageno in ([101105], [100100])
) piv;

SQL Fiddle with Demoを参照してください。

次に、値の数が不明な場合は、動的 SQL を使用する必要があります。

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(pageno) 
                    from yourtable
                    group by pageno
                    order by pageno
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT groupid, ' + @cols + ' 
            from 
            (
              select pageno, groupid, 
                flag = ''X''
              from yourtable
            ) x
            pivot 
            (
                max(flag)
                for pageno in (' + @cols + ')
            ) p '

execute sp_executesql @query;

SQL Fiddle with Demoを参照してください。両方のバージョンで結果が得られます。

|  GROUPID | 100100 | 101105 |
|   gentry |      X |      X |
| mpadilla |      X |      X |
|     test |      X | (null) |

編集、置き換えたいnullがある場合は、列名の2番目のリストを作成します。これは最終的な選択リストに使用されcoalesce、nullを置き換えるために含まれます。コードは次のようになります。

DECLARE @cols AS NVARCHAR(MAX),
    @colsNull AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(pageno) 
                    from yourtable
                    group by pageno
                    order by pageno
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

select @colsNull = STUFF((SELECT ', coalesce(' + QUOTENAME(pageno) +', '''') as '+QUOTENAME(pageno)
                    from yourtable
                    group by pageno
                    order by pageno
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT groupid, ' + @colsNull + ' 
            from 
            (
              select pageno, groupid, 
                flag = ''X''
              from yourtable
            ) x
            pivot 
            (
                max(flag)
                for pageno in (' + @cols + ')
            ) p '

execute sp_executesql @query;

SQL Fiddle with Demoを参照してください。結果は次のようになります。

|  GROUPID | 100100 | 101105 |
|   gentry |      X |      X |
| mpadilla |      X |      X |
|     test |      X |        |
于 2013-09-11T20:34:03.150 に答える
-1

私は自分の質問に答えました。私がしたことは、customized という列を元のテーブルに追加することでした。この列には、カスタマイズされた各ページの x のみが含まれます。ちょっと冗長ですが、ピボット テーブルには 3 つの列が必要なようです。だからここに私が思いついた私の動的コードがあります:

DECLARE @query VARCHAR(4000), @groupids VARCHAR(8000)
SELECT @groupids = STUFF(( SELECT DISTINCT 
    '],[' + LTRIM(groupid) 
    FROM DistinctPages 
    ORDER BY '],[' + LTRIM(groupid)
    FOR XML PATH('')
    ), 1,2, '') + ']'   
SET @query =
'SELECT * FROM (SELECT pageno, groupid, customized FROM DistinctPages)t
PIVOT (MAX(customized) FOR groupid
IN ('+@groupids+')) AS CustomizedPagesPerGroups'
EXECUTE (@query)
于 2013-09-11T20:35:48.073 に答える