由于数据库的庞大规模,我需要将两个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
我遗漏了这个查询也在查询netsales和销售单位的事实,所以我必须考虑到这一点。此查询的一些示例结果(包括省略的netsales和单位部分非常详细)
+------ -+------------+-------------+-------------+
|transcnt| unitssold | salesprsnid | netsalesamt |
+--------+------------+-------------+-------------+
| 2 | 5 | 1339 | 98.50 |
| 1 | 2 | 2555 | 35.20 |
| 2 | 1 | 0452 | 24.00 |
+--------+------------+-------------+-------------+
从上面,员工ID为#34; 0452"在结果中有2个事务(transcnt),但是,我需要构建我的查询,使它实际上读为0个事务,因为它们的1个事务的txnvoidmod等于1,实际上是前一个事务的空白,其中txnvoidmod = 0。如果我只说" txnvoidmod = 0"在where子句中,然后" 0452"将有1个事务,但我仍然需要减去txnvoidmod = 1
的事务我尝试了各种各样的事情,例如条件和减去txnvoidmod的值,但无济于事,因为它试图通过txnvoidmod进行分组,这给了我不必要的行。我需要每个salesprsnid只有一行。
任何建议都会很棒,谢谢。
顺便说一下,我正在使用SAP Sybase数据库..在大多数情况下,查询是相同的,除了缺少的一些项目。
答案 0 :(得分:1)
这个怎么样:
SELECT
txn_pos_transactions.cashiernum AS salesprsnid
,COUNT(DISTINCT CASE txnvoidmod WHEN 1 THEN MS.transnum END) 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 IN(0, 1)
GROUP BY txn_pos_transactions.cashiernum
ORDER BY salesprsnid
答案 1 :(得分:0)
从Dave Sexton的评论中得到一个想法,我将查询更改为:
set ansinull off
select txn_pos_transactions.cashiernum as salesprsnid,
(count((DISTINCT CASE txnvoidmod WHEN 0 THEN MS.transnum END)) -
(count((DISTINCT CASE txnvoidmod WHEN 1 THEN MS.transnum END)) 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
我必须包括"设置ansinull off"因为我收到了空聚合错误。不确定这是否会减慢我的速度,但这看起来确实有效。
由于