【问题标题】:static column name in pivot table数据透视表中的静态列名
【发布时间】:2013-03-28 13:09:27
【问题描述】:
DECLARE @cols AS NVARCHAR(MAX)
DECLARE @query AS NVARCHAR(MAX)


select @cols = '[1015],[1060],[1261],[1373]'

print @cols



set @query = 'SELECT header, ' + @cols + ' 
              from 
             (
                select product_id, header, value
                from
                (
                  select 
                        cast(product_id  as varchar(100))product_id , 
                        cast(product_name  as varchar(100)) product_name,
                        cast(product_price as varchar(100)) product_price, 
                        cast(product_weight as  varchar(100))product_weight,
                        cast((select TOP 1  image_name from tblProductImage where tblProductImage.product_id=tblProduct.product_id) as  varchar(100)) ProductImage      
                  from tblProduct 

                ) p
                unpivot
                (
                  value
                  for header in (product_name, product_price, product_weight,ProductImage)
                ) unp
            ) x
            pivot 
            (
                max(value)
                for product_id in (' + @cols + ')
            ) p '

execute(@query)

我正在使用上述查询及其生成以下输出

现在我的问题是我希望列名应该是静态的 .. 因为目前最多有 5 列,其中第一列将是标题,没关系

但对于列的其余部分,我还希望名称应该类似于 Prodcut1、Product2、Product3 和 Product4 。如果只有三个产品,那么它也会显示五列,但对于最后一列,所有属性值都应该为 null

【问题讨论】:

  • 所以您希望产品列名称为 Product1、Product2、Product3 和 Product4?由于 product_id 不会是列标题,您是否想要另一行具有该值?

标签: pivot unpivot


【解决方案1】:

如果我正确理解您的问题,那么当您传入特定的 product_ids 时,您希望列名称为 Product1Product2 等。

如果正确,那么您可以通过应用 row_number() 创建静态列名。

您的代码将调整为以下内容:

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

DECLARE @prods AS NVARCHAR(MAX)

select @prods = '141,142,143,144'

set @query = 'SELECT header, Product1, Product2, Product3, Product4
              from 
              (
                select header, value,
                  ''Product''+cast(row_number() over(partition by header 
                                                   order by header) as varchar(10)) prods
                from
                (
                  select 
                    cast(product_id as varchar(10)) product_id,
                    product_name, 
                    cast(product_price as varchar(10)) product_price, 
                    product_weight
                  from tblProduct
                  where product_id in ('+@prods+') 
                ) p
                unpivot
                (
                  value
                  for header in (product_name, product_price, product_weight, product_id)
                ) unp
            ) x
            pivot 
            (
                max(value)
                for prods in (Product1, Product2, Product3, Product4)
            ) p '

execute(@query)

SQL Fiddle with Demo。这给出了结果:

|         HEADER | PRODUCT1 | PRODUCT2 | PRODUCT3 | PRODUCT4 |
--------------------------------------------------------------
|     product_id |      141 |      142 |      143 |      144 |
|   product_name |     A141 |     A144 |     A143 |     A142 |
|  product_price |      300 |     4000 |     5000 |      200 |
| product_weight |    200gm |    100gm |    400gm |    300gm |

【讨论】:

  • 是否可以更改标题列的顺序.. 我想要产品名称、产品图片、价格、重量
  • @rahularyansharma 什么版本的 sql server?
  • sql server 2008 r2 ...但我已经在最终 sql 中使用 case 语句作为列名。像这样 'select header, value, 'Product'+cast(row_number() over(partition by header order by header) as varchar(10)) prods, CASE header WHEN 'Product Name' THEN 1 WHEN 'Product Image' THEN 2 WHEN 'Price' THEN 3 WHEN 'Weight' THEN 4 ELSE 5 END as 'num' '
  • @rahularyansharma 由于您使用的是 SQL Server 2008,因此您可以使用 CROSS APPLY 来取消透视,并且可以定义排序顺序列 -- 参见这个演示 -- sqlfiddle.com/#!3/defb7/15 -- 或者您可以使用 @ 987654329@
猜你喜欢
  • 1970-01-01
  • 2019-12-22
  • 2016-03-27
  • 1970-01-01
  • 1970-01-01
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多