选择行到列的某种方法-SQL Server
我想知道是否有办法选择下面的表格选择行到列的某种方法-SQL Server,sql,sql-server-2008,Sql,Sql Server 2008,我想知道是否有办法选择下面的表格 ID | DOCNo | Date 1 | 20 | 12-DEC-12 2 | 21 | 02-NOV-12 3 | 20 | 18-JAN-13 4 | 20 | 10-APR-13 5 | 22 | 12-DEC-12 要在SQL SERVER 2008中执行类似操作,请执行以下操作: DOCNo | ID1 | Date1 | ID2 | Date2 | ID3 | Date3 20
ID | DOCNo | Date
1 | 20 | 12-DEC-12
2 | 21 | 02-NOV-12
3 | 20 | 18-JAN-13
4 | 20 | 10-APR-13
5 | 22 | 12-DEC-12
要在SQL SERVER 2008中执行类似操作,请执行以下操作:
DOCNo | ID1 | Date1 | ID2 | Date2 | ID3 | Date3
20 | 1 | 12-DEC-12 | 3 | 18-JAN-13 | 4 | 10-APR-13
21 | 2 | 02-NOV-12 | NULL | NULL | NULL | NULL
22 | 5 | 12-DEC-12 | NULL | NULL | NULL | NULL
*DOCNo在表中的记录永远不会超过3条
我正在使用SQLServer2008
谢谢
MS SQL Server 2008架构设置:
问题1:
获得最终结果的一种简单方法是使用row_number为每个docno生成一个序列,然后使用CASE表达式应用聚合函数:
select docno,
max(case when seq = 1 then id end) id1,
max(case when seq = 1 then date end) date1,
max(case when seq = 2 then id end) id2,
max(case when seq = 2 then date end) date2,
max(case when seq = 3 then id end) id3,
max(case when seq = 3 then date end) date3
from
(
select id, docno, date,
row_number() over(partition by docno order by date) seq
from yourtable
) d
group by docno;
请参见选择表中是否有有限数量的IDn。意思是ID1,ID2,ID3是它停止的地方,或者它在内部。你能有7,10,15…实际上我刚刚看到:DOCNo在表中的记录永远不会超过3条。。。。它必须是一个查询还是一个存储过程。。。。我能想到一种使用临时表的方法。嗨,物流学家,谢谢你的回复。。。你认为有可能是一个问题吗?这是我最好的选择。。。
SELECT r1.DOCNo,
r1.ID as ID1, r1.Date as Date1,
r2.ID as ID2, r2.Date as Date2,
r3.ID as ID3, r3.Date as Date3
FROM Table1 r1
LEFT OUTER JOIN Table1 r2 ON r1.DOCNo = r2.DOCNo AND r1.ID < r2.ID
LEFT OUTER JOIN Table1 r3 ON r1.DOCNo = r3.DOCNo AND r1.ID < r3.ID
AND r2.ID < r3.ID
WHERE r1.ID = (SELECT min(ID)
FROM Table1
WHERE DOCNo = r1.DOCNo
GROUP BY DOCNo)
AND (CASE WHEN (SELECT count(*)
FROM Table1
WHERE DOCNo = r1.DOCNo
GROUP BY DOCNo) = 2 THEN r2.ID
WHEN (SELECT count(*)
FROM Table1
WHERE DOCNo = r1.DOCNo
GROUP BY DOCNo) = 3 THEN r3.ID ELSE 1 END) IS NOT NULL
| DOCNO | ID1 | DATE1 | ID2 | DATE2 | ID3 | DATE3 |
|-------|-----|-----------|--------|-----------|--------|-----------|
| 20 | 1 | 12-DEC-12 | 3 | 18-JAN-13 | 4 | 10-APR-13 |
| 21 | 2 | 02-NOV-12 | (null) | (null) | (null) | (null) |
| 22 | 5 | 12-DEC-12 | (null) | (null) | (null) | (null) |
| 23 | 6 | 21-JAN-13 | 7 | 24-FEB-13 | (null) | (null) |
select docno,
max(case when seq = 1 then id end) id1,
max(case when seq = 1 then date end) date1,
max(case when seq = 2 then id end) id2,
max(case when seq = 2 then date end) date2,
max(case when seq = 3 then id end) id3,
max(case when seq = 3 then date end) date3
from
(
select id, docno, date,
row_number() over(partition by docno order by date) seq
from yourtable
) d
group by docno;