2016-11-01 120 views
0

這裏是我的查詢,因爲它代表,它的工作原理:SQL篩選

SELECT EXPENDITURES.CNTRT, 
EXPENDITURES.L_CNTRT, 
EXPENDITURES.BE, 
EXPENDITURES.L_BE, 
EXPENDITURES.SPGM_STD, 
EXPENDITURES.L_SPGM, 
EXPENDITURES.CAT, 
EXPENDITURES.L_CAT, 
EXPENDITURES.OCA, 
EXPENDITURES.L_OCA, 
EXPENDITURES.L2, 
EXPENDITURES.L1L5, 
EXPENDITURES.L_L1L5, 
EXPENDITURES.OBJ, 
EXPENDITURES.L_OBJ, 
EXPENDITURES.STFY, 
EXPENDITURES.CF, 
EXPENDITURES.TRNS_AMT, 
EXPENDITURES.MGDT, 
EXPENDITURES.VENDOR_ID_NO, 
EXPENDITURES.VENDOR_LONG_NAME, 
EXPENDITURES.DESCRIPTION, 
EXPENDITURES.INVOICE_NO, 
EXPENDITURES.DN, 
EXPENDITURES.OTHER_DOC_NO, 
EXPENDITURES.PRIM_DOC_NO, 
EXPENDITURES.SECOND_DOC_NO, 
EXPENDITURES.TR 
FROM IDS.EXPENDITURES EXPENDITURES 
WHERE ((EXPENDITURES.BE<>'70212349')) 
AND (EXPENDITURES.OCA LIKE '%C') 
AND (EXPENDITURES.STFY='2017') 
AND (EXPENDITURES.CF<>'C') 
AND ((EXPENDITURES.MGDT<={ts '2016-07-31 00:00:00'}) AND (EXPENDITURES.MGDT>={ts '2016-07-01 00:00:00'})) 

我被要求做的是讓這個,如果你只用場達CF組,總和在TRNS_AMT的基礎上,並且TRNS_AMT的總和> 0,然後返回這些事務上的所有其他數據。

我不是一個SQL人,必須手工完成所有這些工作,並希望得到我需要的任何幫助。我嘗試做一個HAVING和GROUP BY,但它不會讓我忽略GROUP BY後TRNS_AMT後面的所有字段,而GROUP BY後面的所有字段都會導致問題,因爲它們對於任何事務都不相同,從而導致在TRNS_AMT上沒有過濾。


所以,在英語,我需要找到什麼交易,他們通過前17場組合在一起的款項,不等於零,並返回所有28個領域的非零結果,他們TRNS_AMT unsummed ,給用戶。

+0

請爲您正在使用的RDBMS添加標籤,如果可能的話,包括版本。 – DeanOC

+0

@DeanOC我知道這是Oracle,因爲我必須追捕驅動程序才能連接到它,但就是這樣。我只是一個用戶,而且是一個零星的用戶。 – Fixer

回答

0

這個版本的sum(),被稱爲「解析版本」,讓您仍然顯示所有從基表中的行,並計算總和「好像」你被這些欄分組 - 組成一個組的所有行的總和相同。然後過濾出總和爲零的行。 (您需要使用分析功能來做到這一點 - HAVING條件沒有類似的條件,只存在於「聚集版本」)。

當您僅從一個基表中選擇所有內容時,不需要在列名前添加表名(如果需要,給該表一個單字母別名,如FROM IDS.EXPENDITURES E,並將列如E.CNTRT寫入讓眼睛更容易)。

+0

@Phicksur - 如果您進一步檢查結果並且覺得查詢工作不正常,請繼續跟進。我可能誤解了你的一個或多個要求,或者你誤解了我寫的內容。 (手工計算也可能有錯誤!)祝你好運! – mathguy

+0

我會尋找差異原因的第一個地方是四捨五入。如果「手動」檢查發現可以刪除的附加條目,則實際總計(優缺點)可能不完全爲零,但可能爲0.01,並且您正在查看四捨五入到美元的結果。這可以在查詢中解決,'WHERE'子句可以被寫入來檢查'abs(tot_trns_amt)> 0.01'等。 – mathguy

0

你還沒有提到你正在查詢的DBMS。我認爲波紋管將適用於SQL Server 2012或更新版本,也許是oracle,但我不確定。

我使用的是窗和選擇你所需要的列分組的交易金額,然後選擇這個地方是大於0

你也可以使用常規的總和的CTE並加入回去吧與關鍵值,但我不知道這些會是什麼。

 WITH NonZeroTransactions AS(

      SELECT  TotalTRNSAMT =SUM(TRNS_AMT)OVER(PARTITION BY   
                  EXPENDITURES.CNTRT, 
                  EXPENDITURES.L_CNTRT, 
                  EXPENDITURES.BE, 
                  EXPENDITURES.L_BE, 
                  EXPENDITURES.SPGM_STD, 
                  EXPENDITURES.L_SPGM, 
                  EXPENDITURES.CAT, 
                  EXPENDITURES.L_CAT, 
                  EXPENDITURES.OCA, 
                  EXPENDITURES.L_OCA, 
                  EXPENDITURES.L2, 
                  EXPENDITURES.L1L5, 
                  EXPENDITURES.L_L1L5, 
                  EXPENDITURES.OBJ, 
                  EXPENDITURES.L_OBJ, 
                  EXPENDITURES.STFY, 
                  EXPENDITURES.CF 
                 ORDER BY 
                  EXPENDITURES.CNTRT 
                 ), 
    EXPENDITURES.CNTRT, 
    EXPENDITURES.L_CNTRT, 
    EXPENDITURES.BE, 
    EXPENDITURES.L_BE, 
    EXPENDITURES.SPGM_STD, 
    EXPENDITURES.L_SPGM, 
    EXPENDITURES.CAT, 
    EXPENDITURES.L_CAT, 
    EXPENDITURES.OCA, 
    EXPENDITURES.L_OCA, 
    EXPENDITURES.L2, 
    EXPENDITURES.L1L5, 
    EXPENDITURES.L_L1L5, 
    EXPENDITURES.OBJ, 
    EXPENDITURES.L_OBJ, 
    EXPENDITURES.STFY, 
    EXPENDITURES.CF, 
    EXPENDITURES.TRNS_AMT, 
    EXPENDITURES.MGDT, 
    EXPENDITURES.VENDOR_ID_NO, 
    EXPENDITURES.VENDOR_LONG_NAME, 
    EXPENDITURES.DESCRIPTION, 
    EXPENDITURES.INVOICE_NO, 
    EXPENDITURES.DN, 
    EXPENDITURES.OTHER_DOC_NO, 
    EXPENDITURES.PRIM_DOC_NO, 
    EXPENDITURES.SECOND_DOC_NO, 
    EXPENDITURES.TR 
    FROM IDS.EXPENDITURES EXPENDITURES 
    WHERE ((EXPENDITURES.BE<>'70212349')) 
    AND (EXPENDITURES.OCA LIKE '%C') 
    AND (EXPENDITURES.STFY='2017') 
    AND (EXPENDITURES.CF<>'C') 
    AND ((EXPENDITURES.MGDT<={ts '2016-07-31 00:00:00'}) AND (EXPENDITURES.MGDT>={ts '2016-07-01 00:00:00'})) 
    ) 
SELECT * FROM nonZeroTransactions 
WHERE TotalTRNSAMT >0 
+0

@Phicksur - 要找到您的Oracle版本,請運行以下語句:'select * from v $ version;'。 Oracle版本與Oracle數據庫有關。 – mathguy