Как запросить 2 разные функции Sum в одном столбце с оператором вычитания на MSSQL - PullRequest
0 голосов
/ 23 января 2020

У меня есть 2 таблицы LG_060_CLCARD и LG_060_04_STFICHE. Первая таблица имеет порядок информации о клиентах по столбцу LOGICALREF. Я хочу показать все объемы продаж клиентов (из столбца TFALDISCOUNTED таблицы STFICHE) по некоторым критериям. Есть некоторая борьба, которой я бы не достиг. Вот мои sql коды:

SELECT CL.LOGICALREF,
       (ISNULL (IRS04.TOTALDISCOUNTED,0)) AS TOTALDISCOUNTED,
FROM LG_060_CLCARD CL
LEFT JOIN (SELECT CLIENTREF, SUM(TOTALDISCOUNTED) AS TOTALDISCOUNTED
           FROM LG_060_04_STFICHE
           WHERE GRPCODE = 2 AND TRCODE IN (7,8)
           GROUP BY CLIENTREF) IRS04
    ON IRS04.CLIENTREF = CL.LOGICALREF
ORDER BY CL.LOGICALREF

Я хочу суммировать STFICHE.TOTALDISCOUNTED значения столбца, которые STFICHE.TRCODE значения (7,8), а также суммировать те же STFICHE.TOTALDISCOUNTED значения столбца, которые STFICHE.TRCODE значения равны (2,3) и вычитают второе (2,3) значение второго из первого (7,8). Это новое значение будет сумма продаж моих клиентов.

Мой код дает правильный результат для первой части (сумма 7,8 критериев), но я не могу объединить другие критерии.

Моя вторая проблема Отфильтруйте эти значения в диапазоне дат. Например; Я хочу показать объем продаж, который содержит только июнь 2019 года (из столбца STFICHE.DATE). Как я могу добавить это условие к тому же sql?

Ответы [ 2 ]

0 голосов
/ 23 января 2020
  1. Вы можете попробовать добавить еще одно левое объединение в свой запрос, например, так:
    SELECT CL.LOGICALREF,
        (ISNULL(IRS04.TOTALDISCOUNTED,0) - ISNULL(IRS04_2.TOTALDISCOUNTED,0)) AS TOTALDISCOUNTED
    FROM LG_060_CLCARD CL
    LEFT JOIN (
            SELECT CLIENTREF, SUM(TOTALDISCOUNTED) AS TOTALDISCOUNTED
            FROM LG_060_04_STFICHE
            WHERE GRPCODE = 2 AND TRCODE IN (7,8)
            GROUP BY CLIENTREF) IRS04
        ON IRS04.CLIENTREF = CL.LOGICALREF
    LEFT JOIN (
            SELECT CLIENTREF, SUM(TOTALDISCOUNTED) AS TOTALDISCOUNTED
            FROM LG_060_04_STFICHE
            WHERE GRPCODE = 2 AND TRCODE IN (2,3)
            GROUP BY CLIENTREF) IRS04_2
        ON IRS04_2.CLIENTREF = CL.LOGICALREF
    ORDER BY CL.LOGICALREF

Или вы можете использовать с запросом так:

    SELECT CL.LOGICALREF,
        (ISNULL(IRS04.TOTALDISCOUNTED_1,0) - ISNULL(IRS04.TOTALDISCOUNTED_2,0)) AS TOTALDISCOUNTED
    FROM LG_060_CLCARD CL
    LEFT JOIN (
        SELECT 
            CLIENTREF, 
            SUM(CASE WHEN TRCODE IN (7,8) THEN TOTALDISCOUNTED ELSE 0 END) AS TOTALDISCOUNTED_1,
            SUM(CASE WHEN TRCODE IN (2,3) THEN TOTALDISCOUNTED ELSE 0 END) AS TOTALDISCOUNTED_2,
        FROM LG_060_04_STFICHE
        WHERE GRPCODE = 2
        GROUP BY CLIENTREF
    )IRS04 ON CL.LOGICALREF=IRS04.CLIENTREF
Для вашей второй проблемы я обычно использую функции YEAR и MONTH, например:
   SELECT * FROM LG_060_04_STFICHE WHERE YEAR([DATE])='2019' AND MONTH([DATE])='6'

Или для получения данных с диапазоном между 2 датами вы можете использовать BETWEEN утверждение, например:

SELECT * FROM LG_060_04_STFICHE WHERE [DATE] BETWEEN '2019-06-01' AND '2019-06-30'
0 голосов
/ 23 января 2020

Здесь вам, вероятно, нужно указать регистр -

SELECT CL.LOGICALREF,
       (ISNULL (IRS04.TOTALDISCOUNTED,0)) AS TOTALDISCOUNTED,
FROM LG_060_CLCARD CL
LEFT JOIN (SELECT CLIENTREF, SUM(CASE WHEN TRCODE IN (7,8) THEN TOTALDISCOUNTED
                                      WHEN TRCODE IN (2,3) THEN TOTALDISCOUNTED*-1
                                 END) AS TOTALDISCOUNTED
           FROM LG_060_04_STFICHE
           WHERE GRPCODE = 2
           AND STFICHE.DATE BEETWEEN '2019-07-01' AND '2019-07-31'
           GROUP BY CLIENTREF) IRS04
    ON IRS04.CLIENTREF = CL.LOGICALREF
ORDER BY CL.LOGICALREF
...