【问题标题】:Need to Pivot String values in SQL server需要在 SQL Server 中透视字符串值
【发布时间】:2017-01-23 03:07:57
【问题描述】:

我有一个带有值的表,描述为:

Occupation String Name String
Developer A
Developer B
Designer X
Coder Y
Coder Z

我需要枢轴格式的值:

Designer Developer Coder
X A Y
Null B Z

有人可以帮忙吗?

提前致谢

【问题讨论】:

  • 您的数据如何知道 Y 绑定到 X 和 A 而 Z 绑定到 B 并且没有设计器?
  • 我猜您想使用行号函数对值进行排序(按操作字符串分区)然后旋转结果...
  • 这种关系不存在..数据只是按字母顺序排序..在数据透视之后
  • 这个设计是 - 呃 - 弱......你的桌子没有任何隐含的顺序。您的价值观之间的关系将接近随机(至少不可预测......)

标签: sql sql-server tsql pivot


【解决方案1】:

带有 ROW_NUMBER() 的基本 PIVOT 将为您做事:

SELECT  [Developer],
        [Designer],
        [Coder]
FROM (
    SELECT  *,
            ROW_NUMBER() OVER (PARTITION BY Occupation ORDER BY (SELECT NULL)) RN
    FROM #temp
) as t
PIVOT (
    MAX(Name) FOR Occupation IN ([Developer],[Designer],[Coder])
) as pvt

输出:

Developer   Designer    Coder
A           X           Y
B           NULL        Z

如果Occupations 的数量可能不同,那么您需要动态 SQL:

DECLARE @columns nvarchar(max),
        @sql nvarchar(max)

SELECT @columns = (
    SELECT DISTINCT ','+QUOTENAME(Occupation)
    FROM #temp
    FOR XML PATH('')
)

SELECT @sql = N'
SELECT  '+STUFF(@columns,1,1,'')+'
FROM (
    SELECT  *,
            ROW_NUMBER() OVER (PARTITION BY Occupation ORDER BY (SELECT NULL)) RN
    FROM #temp
) as t
PIVOT (
    MAX(Name) FOR Occupation IN ('+STUFF(@columns,1,1,'')+')
) as pvt'

EXEC sp_executesql @sql

注意:我使用ORDER BY (SELECT NULL) 只是为了获得一些随机排序。最好为此目的使用一些实际字段。

【讨论】:

  • 您的ROW_NUMBER() OVER (PARTITION BY Occupation ORDER BY (SELECT NULL)) 将定义一些顺序,但这是不可预测的。我会说,这种方法 - 即使它有效! - 是不应该做的事...
  • @Shnugo 而不是(SELECT NULL) OP 可以使用他需要/可以的任何字段。这只是一个例子。如果我没有任何字段可用于排序,我个人会使用这种排序,这在我们(公司)数据库中很少见。
  • 谢谢..你更聪明!我在上面投入了几个小时.. :(
  • 是的,但人们不知道这...意识到你暗示的顺序是不可预测的事实,你可能会这样做,但我不会......
  • 我的荣幸!正如 Shnugo 评论的那样,最好使用其他字段而不是 (SELECT NULL),这会给出一些随机排序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 2018-10-05
  • 2019-05-14
相关资源
最近更新 更多