首页 > 解决方案 > 使用转置执行查找的 SQL 查询

问题描述

我想实现以下目标,老实说,我什至不知道从哪里开始。我们有两个表,客户和订单。我需要创建第三个表,该表将包含组合数据,并以水平方式显示。

这些是当前表格:

顾客:

             Id           Email          Language  
Customer1     1       cust1@email.com       en          
Customer2     2       cust2@email.com       sp         
Customer3     3       cust3@email.com       ru 

订单:

        Id         CustomerId        Total
         a              1             200      
         b              1             300     
         c              2             400   
         d              3             500   
         e              3             500   
         f              3             500   
         g              3             500   

和期望的结果:

CustomerID  Email  Language  Order1   Order2   Order3   Order4   Order5   Order6
    1                           a        b        -        -        -        -
    2                           c        -        -        -        -        -
    3                           d        e        f        g        -        -

每个客户最多可以有 6 个活动订单,但逻辑也可以是每个客户只列出 6 个第一个订单。有关如何实现此结果的任何建议?对你的帮助表示感谢。

标签: sqlsql-serversql-server-2005

解决方案


SQL 表代表无序表。除非列指定ordering ,否则没有ordering 。让我假设它id扮演了这个角色。

然后,您可以使用条件聚合来执行此操作:

select c.id, c.email, c.language,
       max(case when seqnum = 1 then o.id end) as order_1,
       max(case when seqnum = 2 then o.id end) as order_2,
       max(case when seqnum = 3 then o.id end) as order_3,
       max(case when seqnum = 4 then o.id end) as order_4,
       max(case when seqnum = 5 then o.id end) as order_5,
       max(case when seqnum = 6 then o.id end) as order_6
from customers c left join
     (select o.*,
             row_number() over (partition by customerid order by id) as seqnum
      from orders o
     ) o
     on c.customerid = o.customerid
group by c.id, c.email, c.language;

推荐阅读