SQL — суммирование значений из разных строк с использованием Case, When

Я пытаюсь найти труд и накладные расходы для предметов для отчета. Трудозатраты и накладные расходы определяются путем манипулирования данными из столбцов «Фактор» и «Ставка». Эти факторы и ставки классифицируются по разным типам. Это гораздо сложнее, чем должно быть, и моя работа состоит в том, чтобы разобраться в этом.

Вот фрагмент данных, возвращенных с несортированным столбцом затрат. введите здесь описание изображения

Когда тип = W10, то затраты основаны на трудозатратах, когда тип = WO1 или WO2, тогда затраты основаны на накладных расходах.
Мое затруднительное положение сводится к тому, что я должен добавить значения, найденные, когда тип = 'WO1 , WO2' вместе, чтобы получить общие накладные расходы.
Я решил использовать CASE/WHEN, чтобы попытаться получить нужные мне данные, но я не могу понять, как сложить стоимость накладных расходов вместе.

Мой код до сих пор:

SELECT DISTINCT 'LABOR' = CASE 
WHEN TYPE = 'W10' THEN (FACTOR * RATE)
ELSE 0 
END, //This part is fine//
'OVERHEAD' = CASE 
WHEN TYPE = 'WO1, WO2' THEN SUM(FACTOR * RATE) 
ELSE 0
END,

FROM TABLE_1  

Однако СУММА (коэффициент * ставка) не суммирует две строки затрат, когда тип = WO1 или WO2, она возвращает 0 следующим образом:

введите здесь описание изображения

Я не знаю, насколько хорошо я описал свою проблему, но было бы здорово, если бы вы, ребята, помогли разобраться с этой проблемой.


person Jabo13    schedule 13.06.2016    source источник
comment
Что это за база данных? У вас есть теги mysql и tsql (SQL Server).   -  person sstan    schedule 13.06.2016
comment
@jabo13 агрегатная функция без GROUP BY?   -  person Biju jose    schedule 13.06.2016
comment
@Bijujose Я не добавлял Group By в свой пример кода, потому что не думал, что это необходимо для решения проблемы, но ниже FROM TABLE_1 у меня есть GROUP BY Rate, Factor, Type   -  person Jabo13    schedule 13.06.2016


Ответы (2)


Попробуйте с

when type IN ('W01','W02')

Написав TYPE = 'WO1, WO2', вы ищете 'W01,W02', а не один из них.

Поскольку приведенное выше утверждение не работает нормально, по мнению заявителя, я добавляю следующее:

'OVERHEAD' = CASE 
WHEN TYPE = 'WO1' THEN SUM(FACTOR * RATE) 
WHEN TYPE = 'WO2' THEN SUM(FACTOR * RATE) 
ELSE 0
END,
person CiroRa    schedule 13.06.2016
comment
это помогает избавиться от значений 0, но данные из WO1 и WO2 по-прежнему не складываются. - person Jabo13; 13.06.2016
comment
посмотри мое новое решение - person CiroRa; 13.06.2016

Давайте создадим некоторые образцы данных и попробуем

CREATE TABLE TABLE_1 (rate FLOAT, Factor FLOAT, costs FLOAT, Type VARCHAR(3))

INSERT INTO TABLE_1
VALUES (.225000, 33.00000, 7.4250000, 'W10')

INSERT INTO TABLE_1
VALUES (1.0000, 14.8500, 14.8500, 'W01')

INSERT INTO TABLE_1
VALUES (1.0000, 1.1666, 1.16660000, 'W02')

Надеюсь, я добавил только первый элемент A. Если я понимаю проблему, проблема заключается в предложении GROUP BY. Если я перепишу код, как показано ниже, и сгруппирую W01 и W02 перед расчетом, вы получите желаемый результат.

SELECT CASE 
        WHEN [TYPE] = 'A'
            THEN SUM(N)
        ELSE 0
        END AS labour
    ,CASE 
        WHEN [TYPE] IN ('B')
            THEN SUM(N)
        ELSE 0
        END AS overhead
FROM (
    SELECT rate * factor AS n
        ,CASE 
            WHEN type = 'W10'
                THEN 'A'
            WHEN type IN ('W01', 'W02')
                THEN 'B'
            ELSE ''
            END AS type
    FROM table_1
    ) AS t
GROUP BY [type] 

Я надеюсь, что это тот результат, который вы хотели, если нет, пожалуйста, опубликуйте DDL и некоторые примеры данных с требуемым выводом.

person Biju jose    schedule 14.06.2016