将行旋转到列名不是来自该行的列中

时间:2018-11-08 04:11:12

标签: sql sql-server pivot

我查看了一些答案,但似乎没有一个适用于我。

基本上我有这个结果集:

RowNo |  Id  |  OrderNo  |
  1      101       1
  2      101       10

我只想将其转换为

|  Id  |  OrderNo_0  | OrderNo_1 |
  101       1             10

我知道我应该使用PIVOT。但是语法对我来说还不清楚。我尝试了在该社区中看到的任何内容,但似乎找不到适合我的确切用例的

订单号始终为两个。为了使事情更清楚

3 个答案:

答案 0 :(得分:2)

正如您说的那样,每个ID只能有两个订单号,您可以将结果集添加到ID列上。就下面的示例而言,我假设您的结果集仅从单个Orders表中进行选择,但是用现有查询替换它应该足够容易。

SELECT o1.ID, o1.OrderNo AS [OrderNo_0], o2.OrderNo AS [OrderNo_1] 
FROM Orders AS o1 
INNER JOIN Orders AS o2 
ON (o1.ID = o2.ID AND o1.OrderNo <> o2.OrderNo)

答案 1 :(得分:2)

如果您想使用PIVOT,则以下内容适用于提供的数据:

declare @Orders table (RowNo int, Id int, OrderNo int)

insert into @Orders (RowNo, Id, OrderNo)
  select 1, 101, 1 union all select 2, 101, 10

select Id, [1] OrderNo_0, [2] OrderNo_1
from (
  select RowNo, Id, OrderNo
 from @Orders
) SourceTable
pivot (
  sum(OrderNo)
  for RowNo in ([1],[2])
) as PivotTable

参考:https://docs.microsoft.com/en-us/sql/t-sql/queries/from-using-pivot-and-unpivot?view=sql-server-2017

答案 2 :(得分:1)

从示例数据中,最简单的方法就是尝试使用minMAX函数。

SELECT Id,min(OrderNo) OrderNo_0,MAX(OrderNo) OrderNo_1
FROM T
GROUP BY Id