0

私はフィドルの例からクロスタブビューを作成していました。基本的に、 、 、 のテーブルを受け取りCustomersましVendorsProduct Type。ベンダーが行で、列が製品タイプ別の総売上であるビューを生成したいと考えています。

構造は

CustomerID Vendor ProductType
--------------------------------
1            A       Type1  
2            A       Type2  
3            B       Type1  
4            A       Type2

私が望む最終結果は次のとおりです。

Vendor  Type1   Type2
---------------------
 A        1        2     
 B        1        0

/* Count the number of sales by Product Type for each Vendor. */
DECLARE @cols  AS NVARCHAR(MAX),
        @query AS NVARCHAR(MAX)

select @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(ProductType) 
                from MyTable
        FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'')

set @query = 'SELECT Vendor,' + @cols + ' 
        from MyTable
        pivot 
        (
            count (ProductType)
            for ProductType in (' + @cols + ')
        ) p 
    ORDER BY Vendor ASC'
execute(@query)

最終結果は、集計されたカウントを含む単一の行ではなく、ベンダーごとに複数の行になります。

例えば

Vendor  Type1   Type2
---------------------
  A       1       0
  A       0       1
  B       1       0
  A       0       1

このクエリで見逃した可能性があることについて、誰かが洞察を持っていますか?

ありがとう。

4

1 に答える 1

1

サブクエリを使用して、テーブルから必要な列を選択することをお勧めします。問題は、データが と によってグループ化されていることvendorですcustomerIdcustomerIdは行ごとに異なります。クエリを次のように変更すると、結果が得られます。

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

select @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(ProductType) 
                from MyTable
        FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'')

set @query 
     = 'SELECT Vendor,' + @cols + ' 
        from
        (
          select vendor, producttype
          from MyTable
        ) d
        pivot 
        (
            count (ProductType)
            for ProductType in (' + @cols + ')
        ) p 
    ORDER BY Vendor ASC'

execute(@query);

SQL Fiddle with Demoを参照してください。これにより、次の結果が得られます。

| VENDOR | TYPE1 | TYPE2 |
|      A |     1 |     2 |
|      B |     1 |     0 |
于 2013-09-11T14:21:29.750 に答える