0

我正在从小提琴示例中创建一个交叉表视图。本质上,我收到了一张带有Customers,Vendors和的桌子Product 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和分组customerId。每一行customerId都是不同的,将查询更改为以下内容将为您提供结果:

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 回答