sql - 我的 SQL 查询中的条目使结果值加倍
问题描述
我有 3 个表(Transaction、TransactionEntry 和 TenderEntry)。当我运行我的 SQL 查询时,由于 TransactionEntry Table,我得到了两次总和值。
所以假设我有 2 件物品(价值 288.75 美元的衣服和价值 50.00 美元的免费雨伞)。我使用价值 300 美元的现金和价值 100 美元的 GC 结清付款,现在我有一个价值 61.25 美元的现金找零。
以下是 3 个表中的条目
交易表
TransactionNumber|Total|
========================
1 |338.75|
事务条目表
TransactionNumber|ItemID|Price|
===============================
1 |245648|288.75|
1 |129 |50.00 |
投标表
TransactionNumber|TenderID|Description|Amount|
==============================================
1 |1 |Cash |300.00|
1 |1 |Cash |-61.25|
1 |20 |GC |100.00|
这是我到目前为止所做的
select [Transaction].TransactionNumber,
(case when [Transaction].RecallType = 0 then [Transaction].total else 0 end) as Sales,
sum(case when TransactionEntry.ItemID = 6922 then TransactionEntry.Price
when TransactionEntry.price = 0 then TransactionEntry.price else 0 end) as Free,
sum(case when TenderEntry.tenderID = 1 then TenderEntry.Amount else 0 end) as Cash,
sum(case when TenderEntry.tenderID = 20 then TenderEntry.Amount else 0 end) as GC
from [Transaction] inner join
TransactionEntry on [Transaction].transactionnumber = TransactionEntry.transactionnumber inner join
TenderEntry on [Transaction].transactionnumber = TenderEntry.transactionnumber
group by [Transaction].TransactionNumber,
(case when [Transaction].RecallType = 0 then [Transaction].total else 0 end)
我得到这种输出
TransactionNumber|Sales |Free |Cash |GC |
==============================================
1 |338.75|150.00|477.50|200.00|
而不是这个
TransactionNumber|Sales |Free |Cash |GC |
==============================================
1 |338.75|50.00|238.75 |100.00|
解决方案
您希望每个事务有一行,因此我建议您在执行连接之前将连接的表与事务级别相加,如下所示:
select t1.TransactionNumber,
case when t1.RecallType = 0 then t1.total else 0 end as Sales,
t2.Free,
t3.Cash,
t3.GC
from [Transaction] t1
inner join (select transactionnumber,
sum(case when ItemID = 6922 then Price else 0 end) as free
from TransactionEntry
group by transactionnumber) as t2
on t1.transactionnumber = t2.transactionnumber
inner join (select transactionnumber,
sum(case when tenderID = 1 then Amount else 0 end) as Cash,
sum(case when tenderID = 20 then Amount else 0 end) as GC
from TenderEntry
group by transactionnumber) as t3
on t1.transactionnumber = t3.transactionnumber
请注意,我使用了表别名 (t1, t2, t3) 来压缩代码并使其更易于阅读。看起来“事务”是一个保留字,因此可能不是一个很好的表名选择,因为这意味着您在引用它时总是必须使用方括号将名称括起来。
您的这段代码似乎有问题,
sum(case when TransactionEntry.ItemID = 6922 then TransactionEntry.Price
when TransactionEntry.price = 0 then TransactionEntry.price else 0 end) as Free,
因为您说是免费的 Umbrella 是项目 129 而不是 6922。此外,“当 TransactionEntry.price = 0 然后...”将价格设置为 0,而不管价格如何。我不确定你的意图是什么?
推荐阅读
- go - Go(lang)无法找到模块
- outlook - Outlook Office.context.auth.getAccessTokenAsync 和 OfficeRuntime.auth.getAccessToken 不适用于 Intune 设备验证
- r - 有没有办法可以从这个输出摘要中提取值?
- python - 我的 Discord 机器人的命令不起作用......但事件运行良好
- python - 具有自动增量主键的表中的 PyQT QSqlTableModel insertRecord 问题
- extjs - 如何在extjs6.5中将lockingColumn设置为右侧?
- jquery - 如何制作表体滚动?
- javascript - 注销后的Angular 11刷新组件
- google-assistant-sdk - 如何根据自定义事件通过谷歌助手发送通知?
- c# - 为什么在 asp.net 中未检测到 html 输入文本框的更改?