2015-09-28 86 views
0

我正在做一個查詢從1表和使用UNION與2 select的具有不同的條件。如何在SQL中對結果進行分組?

SELECT * 
FROM (
     SELECT DATE(MAX(RECEIVED)) DT, 
      INFO CASH_INFO, 
      SUM(IF(TRANS_TYPE = 714, AMOUNT, 0)) TOTAL_CASH, 
      '' AS OTHER_INFO, 
      0 AS TOTAL_CHEQUE, 
      0 AS TOTAL_CREDIT 
     FROM PAYMENT 
     WHERE LOGIN = 'opensys' 
     AND SOURCE_OF_TRX = '245T2' 
     AND RET_CODE_ID IN (0, 106, 110) 
     AND RECEIVED >= DATE_SUB('2015-09-23 16:30:42', INTERVAL 7 DAY) 
     AND TRANS_TYPE = 714 
     GROUP BY INFO 
     UNION 
     SELECT DATE(MAX(RECEIVED)) DT, 
      '' AS CASH_INFO, 
      0 AS TOTAL_CASH,  
      INFO OTHER_INFO, 
      SUM(IF(TRANS_TYPE = 715, AMOUNT, 0)), -- TOTAL_CHEQUE, 
      SUM(IF(TRANS_TYPE = 716, AMOUNT, 0)) -- TOTAL_CREDIT 
     FROM PAYMENT 
     WHERE LOGIN = 'opensys' 
     AND SOURCE_OF_TRX = '245T2' 
     AND RET_CODE_ID IN (0, 106, 110) 
     AND RECEIVED >= DATE_SUB('2015-09-23 16:30:42', INTERVAL 7 DAY) 
     AND TRANS_TYPE in (715, 716) 
     GROUP BY INFO 
    ) A 
GROUP BY CASH_INFO, OTHER_INFO 
ORDER BY DT 

結果並不準確,因爲該記錄沒有對同一日期記錄進行分組。

我想實現的是將結果與同一日期進行分組。

P/S:最後2條記錄將始終返回相同的日期。這意味着在2015年9月23日將有2日期。

對不起,我無法發佈圖片,所以我必須將其鏈接到我的谷歌驅動器。 image

+0

您的圖像isnt公開。如果你提供[** SqlFiddle **](http://sqlfiddle.com/#!6/256da/8),我們可以更容易地找到答案。也請提供樣品數據和慾望輸出 請閱讀[如何問](http://stackoverflow.com/help/how-to-ask) –

+0

對不起,我把圖像分享給大家。慾望輸出和樣本在圖像本身上。應該很好地解釋我的問題。謝謝! – user3276618

+0

看起來不錯,但問題是我們不能從圖片複製/粘貼。這就是爲什麼我建議一個SqlFiddle,這節省了我們很多時間。 –

回答

0

不幸的是,MySQL允許你發佈的查詢,但因爲你選擇與*項目在彙總查詢不僅限於GROUP BY條款將無法在幾乎所有的關係數據庫管理系統的SQL引擎。你有沒有設置sql_mode to ANSI這個查詢會給出GROUP BY錯誤。

考慮您的聚合查詢的更正的ANSI語法,只選擇那些您打算聚合的字段,然後按日期,cash_info和other_info字段進行分組。

SELECT DT, 
     CASH_INFO, 
     Sum(TOTAL_CASH), 
     OTHER_INFO, 
     Sum(TOTAL_CHEQUE), 
     Sum(TOTAL_CREDIT) 
FROM (
     SELECT DATE(MAX(RECEIVED)) DT, 
      INFO CASH_INFO, 
      SUM(IF(TRANS_TYPE = 714, AMOUNT, 0)) TOTAL_CASH, 
      '' AS OTHER_INFO, 
      0 AS TOTAL_CHEQUE, 
      0 AS TOTAL_CREDIT 
     FROM PAYMENT 
     WHERE LOGIN = 'opensys' 
     AND SOURCE_OF_TRX = '245T2' 
     AND RET_CODE_ID IN (0, 106, 110) 
     AND RECEIVED >= DATE_SUB('2015-09-23 16:30:42', INTERVAL 7 DAY) 
     AND TRANS_TYPE = 714 
     GROUP BY INFO 
     UNION 
     SELECT DATE(MAX(RECEIVED)) DT, 
      '' AS CASH_INFO, 
      0 AS TOTAL_CASH,  
      INFO OTHER_INFO, 
      SUM(IF(TRANS_TYPE = 715, AMOUNT, 0)), -- TOTAL_CHEQUE, 
      SUM(IF(TRANS_TYPE = 716, AMOUNT, 0)) -- TOTAL_CREDIT 
     FROM PAYMENT 
     WHERE LOGIN = 'opensys' 
     AND SOURCE_OF_TRX = '245T2' 
     AND RET_CODE_ID IN (0, 106, 110) 
     AND RECEIVED >= DATE_SUB('2015-09-23 16:30:42', INTERVAL 7 DAY) 
     AND TRANS_TYPE in (715, 716) 
     GROUP BY INFO 
    ) A 
GROUP BY DT, CASH_INFO, OTHER_INFO; 
+0

感謝您的指出,但結果並不是我想要的。由於MAX(CASH_INFO)和Max(OTHER_INFO),結果沒有顯示2個不同的batchID,如圖所示。在日期結束時,將會有2條記錄具有相同的日期,但是查詢結果會返回不同的batchID。 – user3276618

+0

直截了當的修復。只需將「CASH_INFO」和「OTHER_INFO」添加爲不含聚合的字段組。看我的編輯。 – Parfait