sql - 在 SQL Server 中使用联接的正确方法
问题描述
我的数据库中有四个表,如下所示
Transactions
区分买卖交易的表格Products
维护产品详细信息的表Stocks
保持产品数量的表- 表
BillDetails
维护Purchase
和Sales
我确实尝试使用界面进行购买和销售操作,它可以正常工作,但是我在使用 SQL Server 连接从这三个表中检索数据时遇到问题,以向我展示(从哪个产品购买了多少,卖了多少)。
我试过的代码如下。
select
pro_ID
, sum(case when trn_type = 'PRCH' then stk_quantity else 0 end) as stock
, sum(case when trn_type = 'PRCH' then bdt_quantity else 0 end) as purchase
, sum(case when trn_type = 'SALE' then bdt_quantity else 0 end) as Sale
, sum(case when trn_type = 'PRCH' then bdt_quantity else 0 end)-(sum(case
when trn_type = 'PRCH' then bdt_quantity else 0 end)- sum(case when
trn_type = 'SALE' then bdt_quantity else 0 end)) as diff
from
stocks
join
Products on Products.pro_ID = Stocks.stk_Product
right outer join
BillDetails on Products.pro_iD = BillDetails.bdt_Product
join
Transactions on BillDetails.bdt_trnRef = Transactions.trn_Reference
where
pro_ID = '6260100600362'
group by
pro_ID
order by
pro_ID asc
由于我只销售了上述产品中的一种,但我的查询给了我错误的销售和购买结果,如下面的屏幕截图所示。
根据表格信息,正确的信息或结果应如下所示。
- 股票 = 123
- 购买 = 124
- 销售额 = 1
- 差异 = 1
解决方案
这里的问题是您使用股票表作为您的基表。并且您的基表中有两个相同 proID/stk_product 条目。然后,每当您使用此 id 上的条件进行连接时,您将在连接表上拥有两个具有相同值的条目。所以在你做总和之后,你的价值就会翻倍。
我建议您使用产品作为基表,然后进行连接。
你可以试试这个:
with stocks as (
select
Stk_trnref
, stk_Product
, sum(stk_quantity) stk_quantity
group by Stk_trnref, stk_Product
),
select
stk_Product
, sum(case when trn_type = 'PRCH' then stk_quantity else 0 end) as stock
, sum(case when trn_type = 'PRCH' then bdt_quantity else 0 end) as purchase
, sum(case when trn_type = 'SALE' then bdt_quantity else 0 end) as Sale
, sum(case when trn_type = 'PRCH' then bdt_quantity else 0 end)-(sum(case
when trn_type = 'PRCH' then bdt_quantity else 0 end)- sum(case when
trn_type = 'SALE' then bdt_quantity else 0 end)) as diff
from Products
left join stocks on Products.pro_ID = Stocks.stk_Product
left join BillDetails on Products.pro_iD = BillDetails.bdt_Product
left join Transactions on BillDetails.bdt_trnRef = Transactions.trn_Reference
where pro_ID = '6260100600362'
group by pro_ID order by pro_ID asc
推荐阅读
- entity-framework-core - EF 迁移:无法加载程序集。确保从 x64 切换到 x86 后被启动项目引用
- javascript - 使用 jQuery ajax 时在一个 div 中显示所有 laravel 验证错误
- ruby-on-rails - Rails 应用程序为 /cable 路由发出 GET 请求,即使 ActionCable 已从应用程序和系统中完全删除
- email - 使用 google-apps 脚本时未在电子邮件正文中获取主题信息或当前行信息
- python - 我需要一个带有两个键的类似字典的结构,您可以在其中获取所有对象的列表,其中一个具有特定值
- python - 只能将 str (不是“列表”)连接到 str 被问及我无法解决问题
- c - 链表添加和打印
- python - 编写函数以创建新的 pandas 列时出错
- javascript - 使用 React Native 生成 Word 文档
- css - 从许多重复的类名中隐藏和删除一个类的边距