2013-10-22 52 views
1

我想知道是否存在某種方式來選擇表波紋管......好歹選擇行列 - SQL服務器

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的

謝謝!!!

+0

是'SELECT'表中有一定數量的IDn。含義ID1,ID2,ID3是它停止或無限的地方。你可以有7,10,15 ... – logixologist

+0

其實我剛剛看到:'DOCNo將永遠不會有超過3個記錄在表中.... ....它必須是一個查詢或者它可以是一個存儲過程。 ...我可以在使用臨時表的過程中想到一種方法。 – logixologist

+0

嗨logixologist,感謝您的回覆......您認爲可以成爲一個查詢嗎?這對我來說是最好的選擇... –

回答

0

SQL Fiddle

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 

Results

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

一個簡單的方法來獲得最終的結果是使用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 with Demo