由于数据库的庞大规模,我需要将 2 个 SQL 查询合并为一个(大多数零售店位置都很好,但有些事务要多得多)
基本上,我需要给定一天内每位员工的交易数量。为此,我正在计算每个员工的不同交易编号(交易中的每个项目都有自己的行,具有相同的交易编号,因此它需要是不同的)。但是,有一列“txnvoidmod”。基本上目标是如果该列的值为0,我只是简单地计算交易,但如果值为1,我需要减去一个,因为交易实际上是无效的。
这是一些示例数据
+------ -+------------+-------------+
|transnum| txnvoidmod | salesprsnid |
+--------+------------+-------------+
| 115568 | 0 | 1339 |
| 115568 | 0 | 1339 |
| 114566 | 0 | 1339 |
| 114566 | 0 | 1339 |
| 115504 | 0 | 2555 |
| 105551 | 0 | 0452 |
| 105551 | 0 | 0452 |
| 105551 | 0 | 0452 |
| 105552 | 1 | 0452 |
| 105552 | 1 | 0452 |
| 105552 | 1 | 0452 |
+--------+------------+-------------+
我省略了本示例不需要的一些字段。
这是我正在使用的查询
select txn_pos_transactions.cashiernum as salesprsnid,
(count(distinct MS.transnum))as transcnt
from Txn_Merchandise_Sale MS
INNER JOIN txn_pos_transactions ON MS.transnum=txn_pos_transactions.transnum
Where MS.modtime like '2013-06-01 %' AND MS.itemdatetime like '2013-06-01 %'
and (txnvoidmod=0 or txnvoidmod=1)
Group by txn_pos_transactions.cashiernum order by salesprsnid
我忽略了这个查询也查询净销售额和售出单位的事实,所以我必须考虑到这一点。此查询的一些示例结果(包括非常冗长的省略的净销售额和单位部分)
+------ -+------------+-------------+-------------+
|transcnt| unitssold | salesprsnid | netsalesamt |
+--------+------------+-------------+-------------+
| 2 | 5 | 1339 | 98.50 |
| 1 | 2 | 2555 | 35.20 |
| 2 | 1 | 0452 | 24.00 |
+--------+------------+-------------+-------------+
从上面看,ID 为“0452”的员工在结果中有 2 个事务(transcnt),但是,我需要构建我的查询,以便它实际上读为 0 个事务,因为他们的 1 个事务的 txnvoidmod 等于 1,实际上是txnvoidmod=0 的前一个交易无效。如果我在 where 子句中只说“txnvoidmod=0”,那么“0452”将有 1 个事务,但我仍然需要减去 txnvoidmod=1 的事务
我尝试了各种方法,例如条件和减去 txnvoidmod 的值,但无济于事,因为它试图按 txnvoidmod 分组,这给了我不必要的行。我需要每个salesprsnid 只有一行。
任何建议都会很棒,谢谢。
顺便说一句,我使用的是 SAP Sybase 数据库。除了缺少一些项目外,大多数情况下查询似乎是相同的。