Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询(Sybase):根据另一列的值,从一列的和中减去1_Sql_Sql Server_Sybase - Fatal编程技术网

SQL查询(Sybase):根据另一列的值,从一列的和中减去1

SQL查询(Sybase):根据另一列的值,从一列的和中减去1,sql,sql-server,sybase,Sql,Sql Server,Sybase,由于数据库的巨大规模,我需要将两个SQL查询合并为一个查询(大多数零售店位置都可以,但有些有更多的事务) 基本上,我需要给定一天每个员工的事务数。要做到这一点,我要计算每个员工的事务编号的不同数量(事务中的每个项目都有自己的行,具有相同的事务编号,因此它需要不同)。但是,有一列“txnvoidmod”。基本上,我们的目标是,如果该列的值为0,我通常只计算事务,但是如果该值为1,我需要减去1,因为事务实际上是无效的 下面是一些示例数据 +------ -+------------+--------

由于数据库的巨大规模,我需要将两个SQL查询合并为一个查询(大多数零售店位置都可以,但有些有更多的事务)

基本上,我需要给定一天每个员工的事务数。要做到这一点,我要计算每个员工的事务编号的不同数量(事务中的每个项目都有自己的行,具有相同的事务编号,因此它需要不同)。但是,有一列“txnvoidmod”。基本上,我们的目标是,如果该列的值为0,我通常只计算事务,但是如果该值为1,我需要减去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和units Seld,所以我必须考虑到这一点。此查询的一些示例结果(包括省略的非常详细的netsales和units部分)

从上面可以看出,id为“0452”的员工在结果中有2个事务(transcnt),但是,我需要构建我的查询,使其实际读取为0个事务,因为他们的1个事务的txnvoidmod等于1,并且实际上是上一个事务的无效事务,其中txnvoidmod=0。如果我在where子句中只说了“txnvoidmod=0”,那么“0452”将有1个事务,但我仍然需要减去txnvoidmod=1的事务

我尝试过各种方法,比如条件语句和减去txnvoidmod的值,但都没有用,因为它试图按txnvoidmod分组,这会给我不必要的行。我需要每个salesprsnid只有一行

任何建议都很好,谢谢

顺便说一下,我正在使用SAP Sybase数据库。。大多数情况下,这些查询似乎都是相同的,只是缺少了一些项目。

这是怎么回事:

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

根据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
我必须包括“set ansinull off”,因为我得到的是null聚合错误。不确定这是否会让我慢下来,但这似乎确实有效


谢谢

为什么where子句中有
或txnvoidmod=1
?你不想排除那些记录吗?我刚刚意识到我的问题措辞有点错误。我不仅需要不计算它们,还需要在txnvoidmod=1时减去一。原因是存在一个对应的事务,其中txnvoidmod=0,那么当该事务无效时,它将作为另一个事务出现,其中txnvoidmod=1。因此,我必须只计算txnvoidmod=0时的不同事务,然后为txnvoidmod等于1的每个事务减去1。我编辑了原始帖子以反映这一点。上面统计了作废的交易数量。然而,它给了我一个应该有效的想法。我将COUNT(1时的不同大小写txnvoidmod,然后是MS.transnum END)添加为transvoids,然后将COUNT(0时的不同大小写txnvoidmod,然后是MS.transnum END)添加为transcnt,并在逻辑中简单地减去它们。这应该行得通。。但是,我得到了以下sql错误“聚合函数中消除了空值”。但它仍然有效。。嗯,我会玩的。谢谢
 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