sql - 如何使用条件连接到另一个表中的数据子集
问题描述
我有一张表格,其中包含来自不同研究的许多通货膨胀因素,并希望将特定因素作为销售数据表格中的另一列引入。
我收到以下错误:子查询返回超过 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 语句,但是我得到了关于太多结果的相同错误。我也尝试了外部应用并得到了同样的结果。
在这里的任何帮助将不胜感激!
解决方案
另一种方法:
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
推荐阅读
- sql - SQL 创建表列
- c# - Websocket 出现错误:在使用西里尔文而不是英文时,帧必须以空八位字节终止
- java - 如何使链表排序?
- sql - 违反完整性约束 - 未找到父键
- dart - 为什么必须在类中调用 _internal()?
- informatica - 为什么联合转型是活跃的?
- python - 如何在不手动更改配置的情况下运行不同的文件?
- function - 为 pine 脚本写一个简单的条件
- javascript - React / MUI:如何在主 App.js 中使用钩子按钮调用其他类
- reactjs - 基于 cms 在 React/Typescript 应用程序中添加某个字段值时的条件样式