【问题标题】:SQL query to perform a lookup with transpose使用转置执行查找的 SQL 查询
【发布时间】:2020-01-23 13:38:33
【问题描述】:

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

这些是当前的表格:

客户:

             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 个第一个订单。 有关如何实现此结果的任何建议?对你的帮助表示感谢。

【问题讨论】:

  • 预期输出中的所有内容都来自订单表。我不确定您所说的“组合”是什么意思。
  • 抱歉,这只是一个简化 - 让我在 OUTPUT 表中添加更多内容。
  • @StringTheory 如果这一切都在一个表中,哪个 SQL 函数可以让我得到想要的结果?
  • 一旦你加入这两个表(你也可以在之后这样做),你可以使用case 语句,但将它们包裹在max 周围,这样你就可以得到每个客户 ID 一行。不要忘记使用group by。您应该首先尝试不使用max 来了解您为什么需要它。这里有一些帮助techslides.com/…

标签: sql sql-server sql-server-2005


【解决方案1】:

SQL 表代表无序 表。没有排序除非列指定排序。让我假设 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-15
    • 2010-12-24
    • 1970-01-01
    • 2023-02-05
    • 2016-01-27
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    相关资源
    最近更新 更多