2011-03-02 70 views
0

嗨,我有一個查詢,我需要顯示用戶進行的交易,每天的數量,與歐元相當於每筆交易的。不能組SQL結果正確

查詢下面不這樣做(發現歐元相當於通過獲得的平均速率),而是因爲貨幣是不同的我通過總用貨幣得到的結果,而不是不能及的。什麼該查詢返回的是:

 
Numb Transactions,Date, userid,transaction_type,total value (per currency),eur_equiv 
1     12/12, 2,  test    5       10 
2     12/12,2,  test    2        2 

,而我希望它返回

 
Numb Transactions,Date, userid,transaction_type,total value (per currency),eur_equiv 
1     12/12, 2,  test    7       12 

查詢如下所示

SELECT COUNT(DISTINCT(ot.ID)) AS 'TRANSACTION COUNTER' 
     ,CONVERT(VARCHAR(10) ,ot.CREATED_ON ,103) AS [DD/MM/YYYY] 
     ,lad.ci 
     ,ot.TRA_TYPE 
    ,c.C_CODE 
     ,CASE 
      WHEN op.CURRENCY_ID='CURRENCY-002' THEN SUM(CAST(op.IT_AMOUNT AS MONEY)) 
       /(
        SELECT AVG(CAST(cr.B_RATE AS MONEY)) AS AVG_RATE 
        FROM C_RATE cr 
        WHERE cr.CURRENCY_ID = 'CURRENCY-002' 
       ) 
      WHEN op.CURRENCY_ID='-CURRENCY-005' THEN SUM(CAST(op.IT_AMOUNT AS MONEY)) 
       /(
        SELECT AVG(CAST(cr.B_RATE AS MONEY)) AS AVG_RATE 
        FROM C_RATE cr 
        WHERE cr.CURRENCY_ID = 'CURRENCY-005' 
       ) 
      WHEN op.CURRENCY_ID='CURRENCY-006' THEN SUM(CAST(op.IT_AMOUNT AS MONEY)) 
       /(
        SELECT AVG(CAST(cr.B_RATE AS MONEY)) AS AVG_RATE 
        FROM C_RATE cr 
        WHERE cr.CURRENCY_ID = 'CURRENCY-006' 
       ) 
          ELSE '0' 
     END AS EUR_EQUIVAL 
FROM TRANSACTION ot 
     INNER JOIN PAYMENT op 
      ON op.ID = ot.ID 
     INNER JOIN CURRENCY c 
      ON op.CURRENCY_ID = c.ID 
     INNER JOIN ACCOUNT a 
      ON a.ID = ot.ACCOUNT_ID 
     INNER JOIN ACCOUNT_DETAIL lad 
      ON lad.A_NUMBER = a.A_NUMBER 
     INNER JOIN CUST cus 
      ON lad.CI = cus.CI 
WHERE ot.TRA_TYPE_ID IN ('INBANK-TYPE' 
           ,'IN-AC-TYPE' 
           ,'DOM-TRANS-TYPE') 
     AND ot.STATUS_ID = 'COMPLETED' 
     AND cus.BRANCH IN ('123' 
             ,'456' 
             ,'789' 
             ,'789') 
GROUP BY 
     lad.CI 
     ,CONVERT(VARCHAR(10) ,ot.CREATED_ON ,103) 
    ,c.C_CODE 
     ,op.CURRENCY_ID 
     ,ot.TRAN_TYPE_ID 
HAVING SUM(CAST(op.IT_AMOUNT AS MONEY))>'250000.00' 
ORDER BY 
     CONVERT(VARCHAR(10) ,ot.CREATED_ON ,103) ASC 
+0

你就不能由添加另一組,並選擇MIN(麻木),日期,MIN(用戶名),MIN(TRANSACTION_TYPE),SUM(總值),SUM(eur_equiv) – 2011-03-02 09:07:58

+0

試圖通過SUM來GOUP (CAST(op.IT_AMOUNT AS MONEY),但我得到一個錯誤不能使用聚合或在使用的表達式 – andreas 2011-03-02 09:13:00

+0

你是否包裝你的當前選擇到另一個選擇做額外的組?只查看你當前和必需的輸出,全部你需要的是MIN(Numb Transactions)和兩個金額的總和。 – 2011-03-02 09:34:19

回答

0
SELECT MIN([Numb Transactions] 
     , Date 
     , UserID 
     , Transaction_type 
     , SUM([Total Value] 
     , SUM([Eur Equiv] 
FROM (
      ... -- Your current select (without order by) 
     ) q 
GROUP BY 
     Date 
     , UserId 
     , Transaction_type     
+0

我不會推薦這些查詢的性能原因,雖然它會給出最快的修復解決方案,我認爲最好調整原始查詢以顯示正確的信息 – 2011-03-02 09:56:35

+0

@Uwe,那裏沒有任何爭執從長遠來看,這絕不是解決方案。如果是一次性臨時報告,請自行解決。 – 2011-03-02 10:17:03

0

的問題在於最有可能在一個雙列在你的加入。我所做的,首先是Select *,並查看哪些列會生成雙行。您可能需要調整雙行的JOIN關係消失。

沒有任何結果集,這是非常難以複製你所得到的錯誤。 檢查以下東西:

  • Select *回報上的數據,我將與聚合函數只合並雙行。如果這裏的答案是「否」,您將需要更改與子選擇器的JOIN關係。我在想,AccountAccount detail表。
  • 某些連接可以創建重複的行如果連接不能足夠獨特。也許你將不得不加入多個這裏的東西,例如JOIN table1 ON table1.ID = table2.EXT_ID and table1.Contact = table2.Contact
0

幾件事情:

1)考慮使用功能: SELECT AVG(CAST(cr.B_RATE AS MONEY)) AS AVG_RATE FROM C_RATE cr WHERE cr.CURRENCY_ID = 'CURRENCY-002' with the currencyID as a parameter

2)會分組集在這裏工作?

3)是在所述殼體上或個別whens總和?

sum(CASE ..) vs sum(cast(op.IT_Amount as money)