2015-04-22 2 views
-1

La requête suivante échoue et se plaint de #1111 - Invalid use of group function à cause des deux appels SUM() intégrés dans les boucles IF. Maintenant, j'essaie d'atteindre les mêmes objectifs tout en migrant vers une autre requête SQL, mais j'ai du mal à trouver le temps, quelqu'un pourrait-il me diriger dans la bonne direction?# 1111 - Utilisation incorrecte de la fonction de groupe

La base de données est composée d'une table invoices qui peut contenir invoices_payments si le client n'a pas payé la facture immédiatement et a effectué des paiements par instal. Connu cela, j'essaie de résumer toutes les factures.invoice_total soustrayant chaque factures_payments.payment_date qui n'est pas égal à la semaine actuelle seulement si invoices.issued_date est égal à la semaine en cours, sinon j'essaye de faire toutes les factures_payments.payment_amount où factures_payments .payment_date est égal à la semaine en cours.

SELECT 
    SUM(

     IF (
      YEARWEEK(i.issue_date, 1) = YEARWEEK(NOW(), 1), 
      i.invoice_total, 
      0 
     ) 
    ) AS week_invoiced, 
    ##SUM Functions embedded inside the next IF are causing error: #1111 - Invalid use of group function 
    SUM(

     IF (
      ## If payment is issued on current week 
      i.issued_date IS NOT NULL 
      AND YEARWEEK(i.issued_date, '%Y%m') = YEARWEEK(NOW(), '%Y%m'), 
      ## Sum each invoice.invoice_total and substract each invoices_payments not issued on current week 
      SUM(i.invoice_total) - SUM(

       IF (
        ip.id IS NOT NULL 
        AND YEARWEEK(ip.payment_date, 1) != YEARWEEK(NOW(), 1), 
        ip.payment_amount, 
        0 
       ) 
      ), 

     IF (
      ## If payment is not issued on current week 
      i.issued_date IS NULL 
      OR (
       i.issued_date IS NOT NULL 
       AND YEARWEEK(i.issued_date, '%Y%m') != YEARWEEK(NOW(), '%Y%m') 
      ), 
      ## Sum each invoices_payments issued on current week 
      SUM(

       IF (
        ip.id IS NOT NULL 
        AND YEARWEEK(ip.payment_date, 1) = YEARWEEK(NOW(), 1), 
        ip.payment_amount, 
        0 
       ) 
      ), 
      0 
     ) 
     ) 
    ) AS week_paid, 
    SUM(

     IF (
      DATE_FORMAT(i.issue_date, '%Y%m') = DATE_FORMAT(NOW(), '%Y%m'), 
      i.invoice_total, 
      0 
     ) 
    ) AS month_invoiced 
FROM 
    `invoices` AS i 
INNER JOIN `currency` AS cur ON i.currency_id = cur.id 
LEFT JOIN `invoices_payments` AS ip ON ip.invoice_id = i.id 
WHERE 
    i.coach_id = 279 
AND (
    DATE_FORMAT(i.issue_date, '%Y%m') = DATE_FORMAT(NOW(), '%Y%m') 
    OR DATE_FORMAT(i.issued_date, '%Y%m') = DATE_FORMAT(NOW(), '%Y%m') 
    OR (
     ip.id IS NOT NULL 
     AND DATE_FORMAT(ip.payment_date, '%Y%m') = DATE_FORMAT(NOW(), '%Y%m') 
    ) 
) 
GROUP BY 
    i.id 

Répondre

0

Vous n'avez pas besoin du SUM externe où le problème est. Autrement dit, les SUM internes suffisaient:

SUM(SUM()-SUM()) 

->

SUM()-SUM()