2013-07-25 55 views
0

我有2個SQL查詢需要合併爲一個,這是由於數據庫的絕對大小(大部分零售商店位置,但很好,但有些交易要多得多)SQL查詢(Sybase):根據另一列的總和減去1取決於另一列的值

基本上,我需要每個員工在特定日期的交易數量。爲此,我計算每個員工的不同交易數量(交易中的每個項目都有相同的交易編號,因此它需要不同)。但是,有一列「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」的僱員具有的結果(transcnt)2交易,但是,我需要構建我的查詢,以便它實際讀取爲0個事務,因爲它們的1個事務的txnvoidmod等於1,實際上是其中txnvoidmod = 0的前一個事務的無效。如果我只在where子句中說「txnvoidmod = 0」,那麼「0452」將有1個事務,但我仍然需要減去事務,其中txnvoidmod = 1我試過各種東西,如條件並減去txnvoidmod的值,但無濟於事,因爲它試圖通過txnvoidmod給我不必要的行進行分組。我需要每個salesprsnid只有一行。

任何建議將是偉大的,謝謝。

順便說一句,我正在使用SAP Sybase數據庫..它似乎在大多數情況下查詢是相同的,但他們缺少的一些項目的例外是相同的。

+0

爲什麼在where子句中有'或txnvoidmod = 1'?你不想排除這些記錄嗎? –

+0

我剛剛意識到我的問題略有誤解。我不僅需要對它們進行計數,還需要在txnvoidmod = 1時減去一個。原因是因爲有一個相應的事務,其中txnvoidmod = 0,那麼當事務無效時,它將作爲txnvoidmod = 1的另一個事務進入。因此,我只能在txnvoidmod = 0時對不同的交易進行計數,然後在txnvoidmod等於1的每個交易中減1。我編輯原始帖子以反映此情況 – mtotho

回答

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 
+0

以上統計了無效交易的數量。但它給了我一個應該工作的想法。我添加COUNT(DISTINCT CASE txnvoidmod WHEN 1 THEN MS.transnum END)AS transvoids然後COUNT(DISTINCT CASE txnvoidmod WHEN 0 THEN MS.transnum END)AS transcnt並簡單地將它們在邏輯中相減。這應該工作..但是我得到以下的SQL錯誤「在集合函數中消除空值」。但它仍然有效..嗯,我會玩它。謝謝 – mtotho

0

充分利用戴夫·塞克斯頓的評論的想法,我改變了我的查詢如下:

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關」因爲我是獲得空集合錯誤。不知道這是否會減慢我的速度,但這似乎確實起作用。

謝謝

相關問題