2010-07-04 117 views
0

一直試圖將一個將查詢數據排序爲財務年度(我已排序)的SQL查詢,然後根據claim_id列中的每個不同值對其進行求和。不同行的SQL SUM ....我卡住了!

表結構爲:claim(id,claim_id,日期,金額)

SQL至今:

SELECT 
    CASE 
     WHEN MONTH(date)>=4 THEN 
      concat(YEAR(date), '-',YEAR(date)+1) 
     ELSE 
      concat(YEAR(date)-1,'-', YEAR(date)) 
    END AS fyear, 
    SUM(amount) AS total, claim_id 
FROM claim 
GROUP BY fyear, claim_id 
ORDER BY claim_id ASC, date ASC 

目前我得到這個

Array 
(
    [fyear] => 2009-2010 
    [total] => 567.89 
    [claim_id] => 1 
) 

這是非常接近,只是因爲GROUP BY的當然claim_id我得到另一個數組爲每個不同的claim_id:

Array 
(
    [fyear] => 2009-2010 
    [total] => 106.76 
    [claim_id] => 2 
) 

什麼其實我喜歡的是:

Array 
(
    [fyear] => 2009-2010 
    [total1] => 567.89 
    [total2] => 106.76 
) 

任何建議請?

謝謝!

+0

嘗試清理SQL語句格式。 4個空格縮進代碼。 – 2010-07-04 15:31:07

+1

爲什麼你真的需要它在列上?在行中有數據有什麼問題!? – 2010-07-04 15:41:08

+0

因爲我想要動態填充表,表中的每一行都有日期,則總共爲每個不同的claim_id列。如果數據從SQL中排出一行,只需加載使用php更容易構建表。除非有更好的方式來做到這一點,我錯過了...... – James 2010-07-04 15:48:47

回答

0

會像...

SELECT * FROM 
    SELECT (CASE 
       WHEN MONTH(date)>=4 THEN 
        concat(YEAR(date), '-',YEAR(date)+1) 
       ELSE 
        concat(YEAR(date)-1,'-', YEAR(date)) 
       END AS fyear, 
       SUM(amount) AS total, claim_id 
     FROM claim 
     WHERE claim_id = 1 
     GROUP BY fyear 
     ORDER BY date ASC), 
    SELECT (CASE 
       WHEN MONTH(date)>=4 THEN 
        concat(YEAR(date), '-',YEAR(date)+1) 
       ELSE 
        concat(YEAR(date)-1,'-', YEAR(date)) 
       END AS fyear, 
       SUM(amount) AS total, claim_id) 
     FROM claim 
     WHERE claim_id = 2 
     GROUP BY fyear 
     ORDER BY date ASC) 
    FROM dual; 

有什麼用處?

+0

嘿嘿,不能讓你的例子工作 - 地方括號不匹配?但與此類似,我認爲抓住了相關claim_ids,然後通過選擇數據循環......但SQL在一個循環是不冷靜,我敢肯定有一個整潔的SQL查詢,將得到我想要的東西。 – James 2010-07-04 16:05:43

+0

只有在每個期間(年)只有2項索賠時才能使用。一旦有3個索賠,這將失敗。 – 2010-07-04 16:08:35

+0

加了一些),我覺得在正確的地方。 – 2010-07-05 08:15:52

0

結束語現有查詢在其他SELECT和使用GROUP_CONCAT可能做你所追求的。我已經測試了SQL本身,但不確定結果是否是您想要的 - 所有總計都會以逗號分隔列表的形式出現在一列中:

SELECT fyear, GROUP_CONCAT(total) FROM (
    SELECT 
     CASE 
      WHEN MONTH(date)>=4 THEN 
       concat(YEAR(date), '-',YEAR(date)+1) 
      ELSE 
       concat(YEAR(date)-1,'-', YEAR(date)) 
     END AS fyear, 
     SUM(amount) AS total, claim_id 
    FROM table1 
    GROUP BY fyear, claim_id 
    ORDER BY claim_id ASC, date ASC 
) AS totals GROUP BY fyear;