2014-10-08 28 views
1

我有以下表格:SQL - 如何在一行中放置一個人的事件順序?

客戶表

Customer_ID 
1 
2 
3 

順序表

Customer_ID Order_ID Brand Order_Date 
1 101 A 01/02/2010 
1 102 B 05/02/2010 
1 103 A 06/01/2014 
2 104 B 02/01/2013 
2 105 D 02/02/2013 
3 106 A 07/03/2013 
3 107 B 07/04/2013 
3 108 C 07/05/2013 
3 109 D 07/07/2013 
3 110 E 07/11/2013 

如何排序由兩個獨立的錶轉這個數據,以獲得一個結果窗口:

Customer Order1 Order2 Order3 Order4 Order5 
1 101 102 103 
2 104 105 
3 106 107 108 109 110 

Customer Order1 Order2 Order3 Order4 Order5 
1 101 102 103  
2 104 105   
3 106 107 108 109 110 

Customer Order1 Order2 Order3 Order4 Order5 
1 A B A  
2 B D   
3 A B C D E 

的Order1-N列僅會上升高達數量最多的訂單一個客戶有這樣,如果客戶有4 10項目,列將Order1 Order2 Order3 ... Order10

謝謝,

+0

你應該能夠在這裏找到答案:http://stackoverflow.com/questions/ 7674786/mysql-pivot-table – Mike 2014-10-08 13:33:07

+0

如果此人有6個ord,該怎麼辦ERS? – 2014-10-08 13:44:54

+1

您正在使用哪些DBMS? Postgres的?甲骨文? – 2015-03-18 08:36:56

回答

0

你沒有提到你正在使用什麼樣的數據庫。一般來說,您需要使用pivot(如mysql)或crosstab(用於PostgreSQL)。你一定可以在SO上找到相關的問題。 邁克mentiond關於MySQL的軸的話題,而這一個解釋了PostgreSQL的交叉表:Group By and add columns

所以在PostgreSQL的,這將是:

SELECT * FROM crosstab(
    'SELECT "Customer_ID", null /*doesnt really matter*/, "Order_ID" FROM orders' 
) AS (Customer_ID int 
    , Order1 int 
    , order2 int 
    , order3 int 
    , order4 int 
    , order5 int 
    , order6 int 
) 
; 
customer_id | order1 | order2 | order3 | order4 | order5 | order6 
-------------+--------+--------+--------+--------+--------+-------- 
      1 | 101 | 102 | 103 |  |  | 
      2 | 104 | 105 |  |  |  | 
      3 | 106 | 107 | 108 | 109 | 110 | 
(3 wiersze) 


SELECT * FROM crosstab(
    'SELECT "Customer_ID", null /*doesnt really matter*/, "Brand" FROM orders' 
) AS (Customer_ID int 
    , "Brand_1" VARCHAR 
    , "Brand_2" VARCHAR 
    , "Brand_3" VARCHAR 
    , "Brand_4" VARCHAR 
    , "Brand_5" VARCHAR 
    , "Brand_6" VARCHAR 
) 
; 
customer_id | Brand_1 | Brand_2 | Brand_3 | Brand_4 | Brand_5 | Brand_6 
-------------+---------+---------+---------+---------+---------+--------- 
      1 | A  | B  | A  |   |   | 
      2 | B  | D  |   |   |   | 
      3 | A  | B  | C  | D  | E  | 
(3 wiersze) 

如果這是你的DBMS - 請參考文檔:http://www.postgresql.org/docs/9.1/static/tablefunc.html#AEN142967 由於交叉表是一個附加模塊(tableFunc)的一部分 - 您需要「打開它」,因爲它默認情況下未啓用(可能這是原因,爲什麼它在sqlFiddle上不起作用)

0

我有通過使用bui的存儲過程完成此操作裝上我的查詢,這將允許你有很多的order_id列。我假設你正在使用MySQL。

這顯示瞭如何輸出order_id,你也可以做同樣的輸出brand

The sqlfiddle

創建表事件和數據

create table Customer (customer_id int); 
create table Orders (customer_id int, order_id int, brand char, order_date date); 
insert into customer values(1); 
insert into customer values(2); 
insert into customer values(3); 
insert into orders values(1, 101,'A', '2010-02-01'); 
insert into orders values(1, 102,'B', '2010-02-05'); 
insert into orders values(1, 103,'A', '2014-01-06'); 

insert into orders values(2, 204,'B', '2013-01-02'); 
insert into orders values(2, 205,'D', '2013-02-02'); 

insert into orders values(3, 306,'A', '2013-03-07'); 
insert into orders values(3, 307,'B', '2013-04-07'); 
insert into orders values(3, 308,'C', '2013-05-07'); 
insert into orders values(3, 309,'D', '2013-07-07'); 
insert into orders values(3, 310,'E', '2013-11-07'); 
insert into orders values(3, 311,'F', '2013-11-07'); 

創建函數BuildQuery對於()

create function buildQuery() returns varchar(4000) 
not deterministic 
reads sql data 
begin 
    -- variables 
    declare query varchar(4000); 
    declare maxcols int; 
    declare counter int; 

    -- initialize 
    set query = ''; 
    set maxcols = 0; 
    set counter = 0; 

    -- get the max amount of columns 
    select count(distinct order_id) as maxorders into maxcols 
    from Orders 
    group by customer_id 
    order by maxorders desc limit 1; 

    -- build the query 
    while counter < maxcols do 
    set counter = counter + 1; 
     set query=concat(query,',replace(substring(substring_index(group_concat(order_id), '','',', counter,'),length(substring_index(group_concat(order_id),'','',', counter,'-1)) + 1),'','','''') as order' ,counter);   
    end while; 

    -- return 
    return query; 
end// 

執行該功能

set @q = buildQuery(); 

set @q = concat('select customer_id ', @q, ' 
       from Orders 
       group by customer_id'); 

prepare s from @q; 
execute s; 
deallocate prepare s; 

運行結果

The results

SqlFiddle

The sqlfiddle

相關問題