2013-02-14 5 views
5

Tôi có bảng sau:SQL Server xoay ... Tôi có thể hiển thị các lăm đơn đặt hàng cuối cùng cho một loạt các loại lệnh

create table myorders(ordertype char(1), orderdate datetime, orderid int) 

bảng này có các dữ liệu sau:

insert into myorders(ordertype, orderdate, orderid) values('P', '2013-02-14 20:04:48:287', 11082360) 
insert into myorders(ordertype, orderdate, orderid) values('P', '2013-02-14 20:02:40:407', 40087130) 
insert into myorders(ordertype, orderdate, orderid) values('P', '2013-02-14 20:02:07:277', 7990558) 
insert into myorders(ordertype, orderdate, orderid) values('C', '2013-02-14 19:58:46:097', 8225181) 
insert into myorders(ordertype, orderdate, orderid) values('P', '2013-02-14 19:58:39:740', 40087129) 
insert into myorders(ordertype, orderdate, orderid) values('C', '2013-02-14 19:57:33:063', 8225235) 
insert into myorders(ordertype, orderdate, orderid) values('C', '2013-02-14 19:56:17:207', 8225233) 
insert into myorders(ordertype, orderdate, orderid) values('C', '2013-02-14 19:54:50:630', 8225232) 
insert into myorders(ordertype, orderdate, orderid) values('P', '2013-02-14 19:48:07:300', 11082337) 
insert into myorders(ordertype, orderdate, orderid) values('P', '2013-02-14 19:47:49:997', 40087128) 
insert into myorders(ordertype, orderdate, orderid) values('P', '2013-02-14 19:46:40:667', 40087127) 
insert into myorders(ordertype, orderdate, orderid) values('C', '2013-02-14 19:45:32:550', 8225231) 
insert into myorders(ordertype, orderdate, orderid) values('P', '2013-02-14 19:45:11:203', 11082326) 
insert into myorders(ordertype, orderdate, orderid) values('C', '2013-02-14 19:44:57:990', 8225230) 
insert into myorders(ordertype, orderdate, orderid) values('P', '2013-02-14 19:43:52:953', 40087126) 
insert into myorders(ordertype, orderdate, orderid) values('C', '2013-02-14 19:43:20:853', 8225229) 
insert into myorders(ordertype, orderdate, orderid) values('P', '2013-02-14 19:41:33:740', 11082319) 
insert into myorders(ordertype, orderdate, orderid) values('C', '2013-02-14 19:41:19:853', 8225228) 
insert into myorders(ordertype, orderdate, orderid) values('P', '2013-02-14 19:40:33:127', 40087125) 
insert into myorders(ordertype, orderdate, orderid) values('P', '2013-02-14 19:40:25:537', 40087124) 

Các dữ liệu trông như thế này:

OrderType OrderDate     OrderId 
-------- -----------------------  --------- 
P  2013-02-14 20:04:48.287 11082360 
P  2013-02-14 20:02:40.407 40087130 
P  2013-02-14 20:02:07.277 7990558 
C  2013-02-14 19:58:46.097 8225181 
P  2013-02-14 19:58:39.740 40087129 
C  2013-02-14 19:57:33.063 8225235 
C  2013-02-14 19:56:17.207 8225233 
C  2013-02-14 19:54:50.630 8225232 
P  2013-02-14 19:48:07.300 11082337 
P  2013-02-14 19:47:49.997 40087128 
P  2013-02-14 19:46:40.667 40087127 
C  2013-02-14 19:45:32.550 8225231 
P  2013-02-14 19:45:11.203 11082326 
C  2013-02-14 19:44:57.990 8225230 
P  2013-02-14 19:43:52.953 40087126 
C   2013-02-14 19:43:20.853 8225229 
P  2013-02-14 19:41:33.740 11082319 
C  2013-02-14 19:41:19.853 8225228 
P  2013-02-14 19:40:33.127 40087125 
P  2013-02-14 19:40:25.537 40087124 

tôi muốn trục dữ liệu để nó trông như thế này:

C_LastFiveOrders C_OrderDate     P_LastFiveOrders P_OrderDate 
---------------- -----------------------  ---------------- ----------------------- 
8225181   2013-02-14 19:58:46.097  11082360   2013-02-14 20:04:48.287 
8225235   2013-02-14 19:57:33.063  40087130   2013-02-14 20:02:40.407 
8225233   2013-02-14 19:56:17.207  7990558   2013-02-14 20:02:07.277 
8225232   2013-02-14 19:54:50.630  40087129   2013-02-14 19:58:39.740 
8225231   2013-02-14 19:45:32.550  11082337   2013-02-14 19:48:07.300 

Lưu ý rằng các đơn đặt hàng được sắp xếp theo thứ tự thứ tự trong thứ tự quyết định.

Tôi muốn có thể thêm các OrderTypes bổ sung. Tôi cũng muốn sự linh hoạt để xem xét các đơn đặt hàng x cuối cùng. Trong mẫu, tôi đang xem năm lệnh cuối cùng. Tôi muốn có thể xem 10 hoặc 20 đơn đặt hàng cuối cùng.

+3

+1 Đối với bảng thử nghiệm và thiết lập dữ liệu! – Bryan

+1

-1 vì không thử bất cứ điều gì! – Kermit

+0

Tôi xứng đáng với điều đó.Tôi sẽ trở thành một guru Pivot như bluefeet. Họ sẽ gọi tôi là Pivot Ken LOL. – codingguy3000

Trả lời

4

Có một số cách khác nhau để thực hiện điều này.

tổng hợp với TRƯỜNG HỢP: Bạn có thể sử dụng một chức năng tổng hợp với một biểu thức CASE:

select 
    max(case when ordertype = 'c' then orderid end) C_LASTFIVEORDERS, 
    max(case when ordertype = 'c' then orderdate end) C_ORDERDATE, 
    max(case when ordertype = 'p' then orderid end) P_LASTFIVEORDERS, 
    max(case when ordertype = 'p' then orderdate end) P_ORDERDATE 
from 
(
    select orderid, ordertype, orderdate, rn 
    from 
    (
    select orderid, ordertype, orderdate, 
     row_number() over(partition by ordertype 
         order by orderdate desc) rn 
    from myorders 
) src 
    where rn <=5 
) s 
group by rn 

Xem SQL Fiddle with Demo.

Nhiều tham gia: Bạn có thể tham gia trên bàn của bạn nhiều lần:

;with cte as 
(
    select orderid, ordertype, orderdate, 
     row_number() over(partition by ordertype 
         order by orderdate desc) rn 
    from myorders 
) 
select 
    c1.orderid C_LASTFIVEORDERS, 
    c1.orderdate C_ORDERDATE, 
    c2.orderid P_LASTFIVEORDERS, 
    c2.orderdate P_ORDERDATE 
from cte c1 
left join cte c2 
    on c1.rn = c2.rn 
    and c2.ordertype = 'P' 
where c1.rn <=5 
    and c1.ordertype = 'C' 

Xem SQL Fiddle with Demo

PIVOT tĩnh:

Cuối cùng, bạn có thể áp dụng cả UNPIVOTPIVOT chức năng để nhận kết quả:

select C_LastFiveOrders, C_orderdate, 
    P_LastFiveOrders, P_orderdate 
from 
(
    select rn, 
    case 
     when col = 'orderid' then ordertype+'_LastFiveOrders' 
     else ordertype+'_'+col end col_name, 
    value 
    from 
    (
    select ordertype, 
     convert(varchar(50), orderdate, 121) orderdate, 
     cast(orderid as varchar(50)) orderid, 
     row_number() over(partition by ordertype 
         order by orderdate desc) rn 
    from myorders 
)src 
    unpivot 
    (
    value 
    for col in (orderdate, orderid) 
) un 
    where rn <= 5 
) s 
pivot 
(
    max(value) 
    for col_name in (C_LastFiveOrders, C_orderdate, 
        P_LastFiveOrders, P_orderdate) 
) piv 

Xem SQL Fiddle with Demo.

động PIVOT:

Nếu OrderType giá trị của bạn không rõ, sau đó bạn có thể sử dụng SQL động:

DECLARE @cols AS NVARCHAR(MAX), 
    @colsName AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(ordertype +c.col) 
         from myorders 
         cross apply 
         (
         select '_LastFiveOrders' col 
         union all 
         select '_OrderDate' 
        ) c 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 


set @query 
    = 'SELECT ' + @cols + ' 
    from 
    (
     select rn, 
     case 
      when col = ''orderid'' then ordertype+''_LastFiveOrders'' 
      else ordertype+''_''+col end col_name, 
     value 
     from 
     (
     select ordertype, 
      convert(varchar(50), orderdate, 121) orderdate, 
      cast(orderid as varchar(50)) orderid, 
      row_number() over(partition by ordertype 
          order by orderdate desc) rn 
     from myorders 
    )src 
     unpivot 
     (
     value 
     for col in (orderdate, orderid) 
    ) un 
     where rn <= 5 
    ) s 
    pivot 
    (
     max(value) 
     for col_name in (' + @cols + ') 
    ) p 
    ' 

execute(@query) 

Xem SQL Fiddle with Demo

Mọi thắc mắc cho kết quả:

| C_LASTFIVEORDERS |    C_ORDERDATE | P_LASTFIVEORDERS |    P_ORDERDATE | 
------------------------------------------------------------------------------------------- 
|   8225181 | 2013-02-14 19:58:46.097 |   11082360 | 2013-02-14 20:04:48.287 | 
|   8225235 | 2013-02-14 19:57:33.063 |   40087130 | 2013-02-14 20:02:40.407 | 
|   8225233 | 2013-02-14 19:56:17.207 |   7990558 | 2013-02-14 20:02:07.277 | 
|   8225232 | 2013-02-14 19:54:50.630 |   40087129 | 2013-02-14 19:58:39.740 | 
|   8225231 | 2013-02-14 19:45:32.550 |   11082337 | 2013-02-14 19:48:07.300 | 
+0

+1 để làm cho tôi cuộn vòng quay 3 bánh. – Kermit

+0

@njk xin lỗi tôi không thể giúp bản thân mình – Taryn

+0

Bạn giành chiến thắng nó hoạt động vấn đề duy nhất với phiên bản sql động là các thecolumns không theo thứ tự. – codingguy3000

2

Điều này có thể hoạt động:

;WITH myorders_CTE AS 
    (
    SELECT ordertype, orderdate, orderid, 
    row_number() over (partition BY ordertype ORDER BY orderdate DESC) AS sequence 
    FROM myorders 
) 

SELECT c.orderid AS C_LastFiveOrders, c.orderdate AS C_OrderDate, 
    p.orderid AS P_LastFiveOrders, p.orderdate AS P_OrderDate 
FROM myorders_CTE c 
JOIN myorders_CTE p ON c.sequence = p.sequence 
WHERE c.ordertype = 'C' 
    AND p.ordertype = 'P' 
    AND c.sequence <= 5 
    AND p.sequence <= 5 
ORDER BY c.sequence 

Nó sử dụng tự tham gia nhưng không sử dụng PIVOT.