2010-07-04 52 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;