首页 > 解决方案 > 如何使用条件连接到另一个表中的数据子集

问题描述

我有一张表格,其中包含来自不同研究的许多通货膨胀因素,并希望将特定因素作为销售数据表格中的另一列引入。

我收到以下错误:子查询返回超过 1 个值。当子查询跟随 =、!=、<、<=、>、>= 或子查询用作表达式时,这是不允许的。

这是一个例子:dbo.Inflation

ID  Group   Year    Factor  
1   Dog    2010    1.00  
1   Dog    2011    1.01  
1   Dog    2012    1.02  
1   Cat    2010    2.00  
1   Cat    2011    2.10  
1   Cat    2012    2.20  
2   Dog    2010    1.05  
2   Dog    2011    1.04  
2   Dog    2012    1.03  
2   Cat    2010    2.50  
2   Cat    2011    2.40  
2   Cat    2012    2.30  

dbo.Sales

SalesID Year    DogSales    CatSales    TotalSales  
1      2010     50,000      25,000      75,000   
2      2010     10,000      15,000      25,000   
3      2011     75,000      50,000      125,000   
4      2012     12,000      10,000      22,000   
5      2012     40,000      15,000      55,000   
6      2012     40,000      30,000      70,000   

我想从我指定的 ID 中返回 Dogs 和 Cats 的销售表中的通货膨胀因素。因此,如果我想对 Dog 因子使用 ID 1 因子,对 Cat 因子使用 ID 2 因子,结果将如下所示:

SalesID Year    DogSales    CatSales    TotalSales  Dog_     Cat_  
                                                    Factor  Factor  
1      2010     50,000      25,000      75,000      1.00     2.50   
2      2010     10,000      15,000      25,000      1.00     2.50   
3      2011     75,000      50,000      125,000     1.01     2.40   
4      2012     12,000      10,000      22,000      1.02     2.30   
5      2012     40,000      15,000      55,000      1.02     2.30   
6      2012     40,000      30,000      70,000      1.02     2.30   

我正在尝试使用带有内部连接的子查询来创建这个新字段,这会不断出错。

Select distinct
Sales.SalesID
,Sales.Year
,Sales.DogSales
,Sales.CatSales
,Sales.TotalSales
,(SELECT Inflation.Factor from dbo.Inflation INNER JOIN dbo.Sales on Inflation.Year = Sales.Year  where Inflation.ID = 1 and Inflation.Group = 'Dog') as Dog_Factor
,(SELECT Inflation.Factor from dbo.Inflation INNER JOIN dbo.Sales on Inflation.Year = Sales.Year where Inflation.ID = 2 and Inflation.Group = 'Cat') as Cat_Factor

FROM dbo.Sales 

这给了我返回多个值的错误,尽管当我在 where 子句中使用相同的标准时,只有我想要加入的一组因素显示在 Inflation 表的结果中。此外,当我将子查询更新为 SELECT TOP 1 而不仅仅是 SELECT 时,该表从正确的相应 Inflation ID 和 Group 返回因子,但仅从 2010 年开始为每行返回因子,就好像它没有识别我的 JOIN 标准,见下文:

SalesID Year    DogSales    CatSales    TotalSales  Dog_     Cat_  
                                                    Factor  Factor  
1      2010     50,000      25,000      75,000      1.00     2.50   
2      2010     10,000      15,000      25,000      1.00     2.50   
3      2011     75,000      50,000      125,000     1.00     2.50   
4      2012     12,000      10,000      22,000      1.00     2.50   
5      2012     40,000      15,000      55,000      1.00     2.50   
6      2012     40,000      30,000      70,000      1.00     2.50   

我希望能够根据需要在 ID 和组之间切换,但将年份作为我加入两个表的关键。

请注意,我还尝试在 FROM 语句之后在 Year 上重复 join 语句,但是我得到了关于太多结果的相同错误。我也尝试了外部应用并得到了同样的结果。

在这里的任何帮助将不胜感激!

标签: sqlssms

解决方案


另一种方法:

Select 
Sales.SalesID
,Sales.Year
,Sales.DogSales
,Sales.CatSales
,Sales.TotalSales
,MAX(case when Inflation.ID = 1 and Inflation.Group = 'Dog' then Inflation.Factor end) as Dog_Factor
,MAX(case when Inflation.ID = 2 and Inflation.Group = 'Cat'then Inflation.Factor end) as Cat_Factor   
FROM dbo.Sales 
LEFT JOIN dbo.Inflation ON Inflation.Year = Sales.Year
GROUP BY Sales.SalesID
,Sales.Year
,Sales.DogSales
,Sales.CatSales
,Sales.TotalSales

推荐阅读