繁体   English   中英

以某种方式选择行到列-SQL Server

[英]Someway to select rows to columns - SQL Server

我想知道是否存在某种选择表的方式...

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条记录

我正在使用SQL Server 2008。

谢谢!!!

SQL小提琴

MS SQL Server 2008架构设置

CREATE TABLE Table1
    ([ID] int, [DOCNo] int, [Date] varchar(9))
;

INSERT INTO Table1
    ([ID], [DOCNo], [Date])
VALUES
    (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'),
    (6, 23, '21-JAN-13'),
    (7, 23, '24-FEB-13')
;

查询1

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) |

获得最终结果的一种简单方法是使用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;

参见带有演示的SQL Fiddle

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM