【问题标题】:Transpose Microsoft SQL Server table [duplicate]转置 Microsoft SQL Server 表 [重复]
【发布时间】:2014-04-16 23:11:21
【问题描述】:

我有两个表,一个标题表和一个明细表。数据如下所示:

    OBJ_NO | Name
    12345  | Fred
    67891  | Bob

Detail表:

    OBJ_NO | HEADER_OBJ_NO | CODE
    1      | 12345         | Red
    2      | 12345         | Blue
    3      | 12345         | Green
    4      | 67891         | Red
    5      | 67781         | Green    

基本上我所追求的是看到这样的东西:

    OBJ_NO | Name | Red | Blue | Green
    12345  | Fred | 1   | 1    | 1
    67891  | Bob  | 1   | 0    | 1

它也可以是不同数量的“颜色”。它没有设置。如上例所示,并非每个 Header Ref 都具有每种颜色中的一种。

我将如何实现这一目标?

【问题讨论】:

  • 这个问题之前已经被问过,但这里有一个 sql fiddle,其中包含一些有用的代码来解决您的问题 -- sqlfiddle.com/#!3/8c731/5
  • 太棒了,谢谢 Bluefeet。完美运行。
  • 这是一个重复的问题吗?数据不包含 1 和 0,这是所需的结果。并且只有一列是旋转的。不是所有的行和所有的列。
  • 我不这么认为,但你们是“专家”:)
  • 您可以使用其中任意数量的副本,包括 thisthis

标签: sql sql-server tsql pivot


【解决方案1】:

SQL Server PIVOT 将为您工作。

  WITH CTE(OBJ_NO, NAME, RED, BLUE, GREEN)
  AS
  (
  SELECT [OBJ_NO]
      ,[NAME]
      ,[red],[blue],[green]
  FROM (SELECT T2.[OBJ_NO]
      ,T2.[NAME], T1.CODE FROM [dbo].[Table_2] T2
   INNER JOIN [dbo].[Table_1] T1 ON T1.HEADER_OBJ_NO = T2.OBJ_NO ) AS SourceTable
   PIVOT
   (MAX(CODE) 
   FOR CODE IN ([red], [blue], [green])
   )AS PivotTable
   )
   SELECT OBJ_NO
   ,NAME
   ,RED = CASE WHEN RED = 'red' THEN 1 ELSE 0 END
   ,BLUE = CASE WHEN BLUE = 'blue' THEN 1 ELSE 0 END
   ,GREEN = CASE WHEN GREEN = 'green' THEN 1 ELSE 0 END
   FROM CTE

【讨论】:

  • 投反对票是怎么回事?恕我直言,这不是一个愚蠢的问题。另一个是关于转置所有行和所有列。这是相似但不同的。 “欺骗”中的枢轴解决方案首先是 UNPIVOT,然后是 PIVOT。我的不这样做。这也是最简单的回应。虽然带有 FOR XML 的 STUFF 可以工作,但我不确定是否所有 DBA 都知道他们头脑中的语法。我并不是说它是最好的,但它不应该被打折,因为它并不复杂。恰恰相反。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-05
  • 2017-10-24
  • 1970-01-01
相关资源
最近更新 更多