Проблема GROUP BY, КОГДА в заявлении CASE - PullRequest
1 голос
/ 21 января 2020

Я пытаюсь, чтобы все косвенные и прямые часы отображались в одной строке, и я знаю, что из-за оператора group by отображаются несколько строк. Тем не менее, я попытался удалить группировку и получил ошибку, что l.CHG_TYPE не включается в агрегат при удалении.

<html><table><body><tr><th>ID</th><th>Billing Period</th><th>Shop</th><th>Shift Code</th><th>Employee #</th><th>Indirect Hours</th><th>Direct Hours</th></tr><tr class="odd"><td>202001404223396</td><td>202001</td><td>Sanitation</td><td>1st</td><td>23396</td><td>&nbsp;</td><td>12.73</td></tr>
<tr><td>202001404223396</td><td>202001</td><td>Sanitation</td><td>1st</td><td>23396</td><td>6.41</td><td>&nbsp;</td></tr>
<tr class="odd"><td>202001205225499</td><td>202001</td><td>Car Shop</td><td>1st</td><td>25499</td><td>&nbsp;</td><td>12.4</td></tr>
<tr><td>202001205225499</td><td>202001</td><td>Car Shop</td><td>1st</td><td>25499</td><td>6.82</td><td>&nbsp;</td></tr>
</table></body></html>
SELECT
    CONCAT(l.FISC_PD, l.LOCATION, l.SHIFT_CODE, e.EmpNo) 'ID',
    l.FISC_PD 'Billing Period', 
    CASE
        WHEN l.LOCATION = '202' THEN 'Specialty Equipment' 
        WHEN l.LOCATION = '205' THEN 'Car Shop'
        WHEN l.LOCATION = '206' THEN 'Truck Shop'
        WHEN l.LOCATION = '404' THEN 'Sanitation'
        WHEN l.LOCATION = '212' THEN 'Tire Shop'
        ELSE l.LOCATION
    END as 'Shop',
    CASE
        WHEN l.SHIFT_CODE in ('2','6') THEN '1st'
        WHEN l.SHIFT_CODE in ('3','4','5') THEN '2nd'
        ELSE NULL
    END as 'Shift Code',
    e.EmpNo 'Employee #',
    CASE
        WHEN l.CHG_TYPE = 'I' THEN ROUND((SUM(l.DURATION)/36000000),2)
        ELSE NULL
    END as 'Indirect Hours',
    CASE
        WHEN l.CHG_TYPE = 'D' THEN ROUND((SUM(l.DURATION)/36000000),2)
        ELSE NULL
    END as 'Direct Hours'
FROM m5prod.mfive.VIEW_EMP_LABOR_JNL l
LEFT JOIN m5prod.mfive.VIEW_ALL_EMPLOYEES e on e.EmpID = l.EMP_ID
WHERE 
    l.location not in ('218', '201')
    and l.FISC_PD in ('202001', '202002', '202003')
GROUP BY
    l.FISC_PD,  
    e.EmpNo,
    l.LOCATION,
    l.SHIFT_CODE,
    l.CHG_TYPE

1 Ответ

2 голосов
/ 21 января 2020

Вы можете использовать условное агрегирование следующим образом:

  • удалить CHG_TYPE из условия GROUP BY
  • переместить выражение CASE в SUM()
SELECT
    CONCAT(l.FISC_PD, l.LOCATION, l.SHIFT_CODE, e.EmpNo) 'ID',
    l.FISC_PD 'Billing Period', 
    CASE
        WHEN l.LOCATION = '202' THEN 'Specialty Equipment' 
        WHEN l.LOCATION = '205' THEN 'Car Shop'
        WHEN l.LOCATION = '206' THEN 'Truck Shop'
        WHEN l.LOCATION = '404' THEN 'Sanitation'
        WHEN l.LOCATION = '212' THEN 'Tire Shop'
        ELSE l.LOCATION
    END as 'Shop',
    CASE
        WHEN l.SHIFT_CODE in ('2','6') THEN '1st'
        WHEN l.SHIFT_CODE in ('3','4','5') THEN '2nd'
        ELSE NULL
    END as 'Shift Code',
    e.EmpNo 'Employee #',
    ROUND(SUM(CASE WHEN l.CHG_TYPE = 'I' THEN l.DURATION END)/36000000),2) as 'Indirect Hours',
    ROUND(SUM(CASE WHEN l.CHG_TYPE = 'D' THEN l.DURATION END)/36000000),2) as 'Direct Hours'
FROM m5prod.mfive.VIEW_EMP_LABOR_JNL l
LEFT JOIN m5prod.mfive.VIEW_ALL_EMPLOYEES e on e.EmpID = l.EMP_ID
WHERE 
    l.location not in ('218', '201')
    and l.FISC_PD in ('202001', '202002', '202003')
GROUP BY
    l.FISC_PD,  
    e.EmpNo,
    l.LOCATION,
    l.SHIFT_CODE

Примечание: не рекомендуется использовать одинарные кавычки для псевдонимов столбцов. В стандарте SQL одинарные кавычки зарезервированы для строковых литералов. Я бы предложил использовать соответствующий символ кавычки для вашей базы данных (MySQL: backticks - SQL Сервер: квадратные скобки - Postgres и Oracle: двойные кавычки). Более того, вы можете использовать псевдонимы столбцов, которые не содержат специальных символов, поэтому их не нужно заключать в кавычки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...