【问题标题】:How to create query in sql to pivot data? [duplicate]如何在 sql 中创建查询以透视数据? [复制]
【发布时间】:2013-02-14 12:12:12
【问题描述】:

我有两个名为 PRODUCTDETAIL 的表

TABLE: PRODUCT
slno  product
1          x    
2          y
3          z

TABLE: DETAIL
product    detail
x          good
y          bad
z          worse
x          bad

我需要输出为

TABLE
X      Y       Z
good   bad     worse
bad

【问题讨论】:

  • 什么版本的 SQL Server?

标签: sql sql-server pivot


【解决方案1】:

这种数据转换称为PIVOT,从 SQL Server 2005 开始,有一个函数可以将数据从行转换为列。

有几种方法可以做到这一点,具体取决于您是否有静态数量的值要转置到列中。所有这些都涉及向数据添加row_number(),以便您可以返回任何产品的多行。

您可以使用带有CASE 表达式的聚合函数:

select 
  max(case when product = 'x' then detail end) x,
  max(case when product = 'y' then detail end) y,
  max(case when product = 'z' then detail end) z
from
(
  select p.product, d.detail,
    row_number() over(partition by p.product order by p.slno) rn
  from product p
  inner join detail d
    on p.product = d.product
) src
group by rn

SQL Fiddle with Demo

你可以使用PIVOT函数:

select x, y, z
from
(
  select p.product, d.detail,
    row_number() over(partition by p.product order by p.slno) rn
  from product p
  inner join detail d
    on p.product = d.product
) src
pivot
(
  max(detail)
  for product in (x, y, z)
) piv

SQL Fiddle with Demo

如果您有未知数量的值(在本例中为产品)转换为列,那么您将需要使用动态 SQL:

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

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

set @query = 'SELECT ' + @cols + ' from 
             (
                select p.product, d.detail,
                  row_number() over(partition by p.product order by p.slno) rn
                from product p
                inner join detail d
                  on p.product = d.product
            ) x
            pivot 
            (
                max(detail)
                for product in (' + @cols + ')
            ) p '

execute(@query)

SQL Fiddle with Demo

所有查询的结果是:

|    X |      Y |      Z |
--------------------------
| good |    bad |  worse |
|  bad | (null) | (null) |

【讨论】:

    【解决方案2】:
    This is your query.
        select p.product, d.detail from product p
    inner join detail d on  p.product = d.product
    

    【讨论】:

      【解决方案3】:

      查看 SQL 连接语句。 This blogpost 解释的很好。

      【讨论】:

        【解决方案4】:
        select d.product, d.detail from detail d
        join product p on d.product = p.product
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-05-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-22
          • 1970-01-01
          • 2023-03-04
          相关资源
          最近更新 更多