2010-07-04 3 views
0

J'ai essayé de mettre en place une requête SQL qui trie les données en années financières (que j'ai triées) puis SUMs selon chaque valeur distincte dans la colonne claim_idSOMME SQL de lignes distinctes .... Je suis coincé!

structure de table est: claim (id, claim_id, date, montant)

SQL jusqu'à présent est:

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 

au moment où je reçois ce

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

Ce qui est vraiment proche, sauf bien sûr en raison de la GROUP BY claim_id Je reçois un autre tableau pour chaque claim_id distincts:

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

Ce que j'aimerais vraiment est:

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

Toutes les suggestions S'il vous plaît?

Merci!

+0

Essayez de nettoyer votre mise en forme des instructions SQL. 4 espaces indent code. –

+1

Pourquoi en avez-vous vraiment besoin sur les colonnes? Quel est le problème d'avoir les données dans les lignes? –

+0

Étant donné que j'essaie de remplir dynamiquement une table, chaque ligne de la table contient la date, puis une colonne pour un total pour chaque claim_id distinct. Juste des charges plus faciles à construire la table avec php si les données sortent du SQL dans une rangée. À moins qu'il y ait une meilleure façon de le faire que je manque ... – James

Répondre

0

Would quelque chose comme ...

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; 

être d'une quelconque utilité?

+0

Hé, vous ne pouvez pas faire fonctionner votre exemple - les parenthèses ne correspondent pas? Mais dans le même ordre d'idée, j'ai envisagé de saisir le claim_ids pertinent, puis de sélectionner les données ... mais SQL dans une boucle n'est pas cool et je suis sûr qu'il y a une requête SQL bien rangée qui obtiendra ce que je veux. – James

+0

Cela ne fonctionnera que s'il n'y a que 2 demandes par période (année). Dès qu'il y a 3 réclamations, cela échouera. –

+0

Ajouté un peu, je pense au bon endroit. –

0

Envelopper votre requête existante dans un autre SELECT et en utilisant GROUP_CONCAT pourrait faire ce que vous recherchez. J'ai testé le SQL lui-même, mais je ne suis pas sûr si les résultats sont ce que vous voulez - tous vos totaux apparaîtront dans une colonne comme une liste séparée par des virgules:

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; 
Questions connexes