#1111 - Неверное использование групповой функции

Следующий запрос завершается ошибкой и жалуется на #1111 - Invalid use of group function из-за того, что оба вызова SUM() встроены в циклы IF. К настоящему времени я пытаюсь достичь тех же целей при переходе на другой SQL-запрос, но у меня очень тяжелые времена, может ли кто-нибудь указать мне правильное направление?

База данных состоит из таблицы invoices, в которой может быть несколько invoices_payments, если клиент не оплатил счет сразу, а вместо этого пошел путем инсталляционных платежей. Известно, что я пытаюсь суммировать все инвойсы.invoice_total, вычитая каждый инвойс_платежи.платежная_дата, которая не равна текущей неделе, только если инвойс.выпущенная_дата равна текущей неделе, если нет, то я пытаюсь суммировать все инвойсы_платежи.платежная_сумма, где инвойс_платежи .payment_date равно текущей неделе.

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

person peris    schedule 22.04.2015    source источник


Ответы (1)


Вам не нужен внешний SUM, где проблема. То есть внутренних SUM достаточно:

SUM( SUM()-SUM() )

-->

SUM()-SUM()
person Rick James    schedule 22.04.2015