2014-10-08 26 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

相关问题