具有相同表数据 SQL Server 的多个联接

Posted

技术标签:

【中文标题】具有相同表数据 SQL Server 的多个联接【英文标题】:Multiple joins with the same table data SQL Server 【发布时间】:2021-12-24 21:40:46 【问题描述】:

我有一个表格数据“销售额”,其中包含按产品和商店划分的每个商店的销售额。

id sales shop
1 100.0 01
1 30.0 02
2 2.0 01
3 100.0 01
3 30.0 02
4 100.0 03
4 10.0 02

我尝试以一种格式获取数据,该格式为我提供商品 ID 和同一行中每家商店的销售额,如下所示:

id sales1 shop1 sales2 shop2 sales3 shop3
1 100.0 01 30.0 02 0.0 03
2 2.0 01 0.0 02 0.0 03
3 100.0 01 30.0 02 0.0 03
4 0.0 01 10.0 02 100.0 03

我尝试将数据与 some (select * from sales where shop='01') 作为 a 进行左连接,但它不起作用,因为 ON 子句仅连接一个表,在本例中为 a。

这是 SQL 查询:

select * 
from 
    (select * 
     from sales 
     where shop = '01') as a 
left join
    (select * 
     from sales 
     where shop = '02') as b on a.id = b.id 
left join
    (select * 
     from sales 
     where shop = '03') as c on a.id = c.id

按照这个逻辑,我丢失了数据的结果4、10.0、02,试图改变像c.id = b.id这样的ON子句加入不同的数据并给我不同的结果。

我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

不太清楚为什么每个商店价值都有一个列。当您拥有 Sales1、Sales2 等时,这似乎是多余的。但是通过使用条件聚合,您可以比所有这些查询更容易地解决这个问题。像这样的东西应该适合你。

select id
    , Sales1 = isnull(max(case when Shop = '01' then sales end), 0)
    , Shop1 = '01'
    , Sales2 = isnull(max(case when Shop = '02' then sales end), 0)
    , Shop2 = '02'
    , Sales3 = isnull(max(case when Shop = '03' then sales end), 0)
    , Shop3 = '03'
from sales
group by id

【讨论】:

酷,这给了我想要的,非常感谢

以上是关于具有相同表数据 SQL Server 的多个联接的主要内容,如果未能解决你的问题,请参考以下文章

将多个 SQL Server 表合并为一个

使用 SSIS 将数据加载到 SQL Server 中的多个表

SQL Server 表分区之水平表分区

Access-SQL:与多个表的内部联接

在 SQL Server 2008 中通过联接在更新表中长时间执行

SQL Server-交叉联接内部联接基础回顾