Utilisation de GROUP BY et ORDER BY sur une JOINTURE INTERNE de la requête SQL

J'utilise la requête suivante pour le groupe de travail, les heures et les frais pour les clients de trois tables, une pour les clients, l'une pour les temps de travail et l'autre pour les dépenses:

SELECT  a.*,
        COALESCE(b.totalCount, 0) AS CountWork,
        COALESCE(b.totalAmount, 0) AS WorkTotal,
        COALESCE(c.totalCount, 0) AS CountExpense,
        COALESCE(c.totalAmount, 0) AS ExpenseTotal
FROM    clients A
        LEFT JOIN
        (
            SELECT  Client, 
                    COUNT(*) totalCount,
                    SUM(Amount) totalAmount
            FROM    work_times
            WHERE   DATE BETWEEN '2013-01-01' AND '2013-02-01'
            GROUP   BY Client
        ) b ON a.Client = b.Client
        LEFT JOIN
        (
            SELECT  Client, 
                    COUNT(*) totalCount,
                    SUM(Amount) totalAmount
            FROM    expenses
            WHERE   DATE BETWEEN '2013-01-01' AND '2013-02-01'
            GROUP   BY Client
        ) c ON a.Client = c.Client
WHERE   b.Client IS NOT NULL OR
        c.Client IS NOT NULL

Vous pouvez voir la requête de travail dans un violon ici.

Je suis en train de modifier la présente requête, de sorte qu'il y a une ligne pour chaque client, pour chaque mois, triés par mois et par client. Je suis en train de le faire avec la suite modifié la requête:

SELECT  a.*,
        COALESCE(b.totalCount, 0) AS CountWork,
        COALESCE(b.totalAmount, 0) AS WorkTotal,
        COALESCE(c.totalCount, 0) AS CountExpense,
        COALESCE(c.totalAmount, 0) AS ExpenseTotal
FROM    clients A
        LEFT JOIN
        (
            SELECT  Client, 
                    COUNT(*) totalCount,
                    SUM(Amount) totalAmount,
                    SUBSTR(Date, 1, 7) as Month
            FROM    work_times
            GROUP   BY Month,Client
            ORDER BY Month
        ) b ON a.Client = b.Client
        LEFT JOIN
        (
            SELECT  Client, 
                    COUNT(*) totalCount,
                    SUM(Amount) totalAmount,
                    SUBSTR(Date, 1, 7) as Month
            FROM    expenses
            GROUP   BY Month,Client
            ORDER BY Month,Client
        ) c ON a.Client = c.Client
WHERE   b.Client IS NOT NULL OR
        c.Client IS NOT NULL

Vous pouvez voir la version modifiée de la requête en action ici.

Il ne fonctionne pas tout à fait juste. Une seule ligne est retournée pour le Client B, même si il y a un temps de travail en janvier 2013 et une charge en février 2013 (donc il devrait y avoir 2 lignes) et il semble que les lignes sont en cours de commande par le Client plutôt que le Mois. Quelqu'un pourrait-il suggérer comment modifier la requête pour obtenir le résultat souhaité qui pour l'exemple sur la deuxième violon serait:

╔════════╦═══════════╦═══════════╦══════════════╦══════════════╗
 CLIENT  COUNTWORK  WORKTOTAL  COUNTEXPENSE  EXPENSETOTAL 
╠════════╬═══════════╬═══════════╬══════════════╬══════════════╣
 A               1         10             1            10 
 B               1         20             0             0 
 A               1         15             0             0 
 B               0         0              1            10 
 C               1         10             0             0 
╚════════╩═══════════╩═══════════╩══════════════╩══════════════╝
Vous n'avez pas besoin de la ORDER BY pour les deux sous-sélectionne. Juste mis pour la réponse finale.
Si la date est un type de données datetime, pourquoi/comment faire un substring() sur celui-ci?
Vos tables de données redondantes, le montant et la date. Vous avez besoin de plus de normaliser votre structure et de se débarrasser de la redondance. La requête est trop ambigu, vous êtes désireux de voir les données spécifiques, mais il n'y a pas de critères en tout sélectionner d'autres que id de client n'est pas null. Si vous souhaitez afficher les données d'une plage de dates spécifiée, regroupés par mois, une requête pour la date. J'avais du recul et regarder la normalisation mon premier problème.
Je ne suis pas sûr de ce que tu veux dire. Je suis à l'aide de montant pour calculer la SOMME et la date de groupe par mois.

OriginalL'auteur Nick | 2013-02-24