【问题标题】:How to build a query that SELECT rows into columns for SQL?如何构建一个查询,将行选择到 SQL 的列中?
【发布时间】:2015-11-25 19:11:54
【问题描述】:

如何在 SQL Server 中编写一个查询,为每个唯一 ID 的每个变量返回一列?下面是我想要完成的一个简化示例。你能指出我正确的方向吗?

Table_Exists

ID    |    LOCATION    |    STATUS
__________________________________
001   |     top        |     3
001   |     mid        |     1
001   |     bot        |     4
002   |     top        |     2
002   |     mid        |     2
002   |     bot        |     1
003   |     top        |     1
003   |     mid        |     4
003   |     bot        |     2

这是我正在尝试的简化示例,显然没有成功。下面的代码会返回一条错误消息,提示 '=' 周围的语法不正确:

SELECT  
  ID,
  LOCATION = top AS Top,
  LOCATION = mid AS Middle,
  LOCATION = bot AS Bottom
FROM 
  Table_Exists

我正在尝试构建:

Table_Desired

ID | Top | Middle | Bottom 
__________________________
001|  3  |   1    |  4
002|  4  |   2    |  2 
003|  1  |   4    |  2

【问题讨论】:

标签: sql sql-server


【解决方案1】:

您可以使用自联接(只要您的 LOCATION 是 NOT NULL 并且它包含所有 top/mid/bot 值):

 SELECT t1.ID, t1.Status AS Top, t2.Status AS Middle, t3.Status AS Bottom
 FROM Table_Exists t1
 JOIN Table_Exists t2
   ON t1.ID = t2.ID
  AND t1.LOCATION = 'top'
  AND t2.Location = 'mid'
 JOIN Table_Exists t3
   ON t1.ID = t3.ID
  AND t1.LOCATION = 'top'
  AND t3.Location = 'bot';

LiveDemo

如需更通用的解决方案,请使用PIVOT:

SELECT
     [ID]
    ,[Top]    = [top] 
    ,[Middle] = [mid]
    ,[Bottom] = [bot]
FROM #Table_Exists t
PIVOT (
   MAX(STATUS) FOR LOCATION IN ([top],[mid],[bot])
) AS Piv

LiveDemo2

【讨论】:

  • 谢谢@lad2025 这很有帮助
  • 如果“状态”的任何值为 0/null,则该“ID”的整行将被排除。如果 Table_Exists 缺少数据,当“Status”为 0/null 时,可以使用 PIVOT 函数返回“ID”行
【解决方案2】:

像这样使用枢轴函数

SELECT
    ID,
    [top] AS [Top],
    [mid] AS Middle,
    [bot] AS Bottom
FROM(SELECT 
    ID, 
    LOCATION,
    STATUS
FROM 
    Table_Exists) AS SourceTable
PIVOT (AVG(STATUS) FOR LOCATION IN ([top],[mid],[bot])) AS PivotTable

【讨论】:

  • 我收到错误消息“将数据类型 nvarchar 转换为 int 时出错。”有什么想法吗? @米海
  • 您的状态列是 nvarchar 吗?如果是这样,那么 CAST(STATUS, int) AS STATUS 会让得到平均值
猜你喜欢
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 2012-10-15
  • 2017-04-12
  • 2010-12-25
  • 2019-09-14
  • 2013-03-01
  • 1970-01-01
相关资源
最近更新 更多