Группировать по справке, требуемой в запросе

#sql #oracle #group-by #case

#sql #Oracle #группировка по #случай

Вопрос:

Приведенный ниже запрос выдает мне 2 строки за 9 недель, в 1-й строке 13 часов REG_HR и 2-й строке 5 часов OT_HR

Я хочу, чтобы все значения за 9-ю неделю были в одной строке

 Select VP.PERSONID as EMPL,
VP.HOMELABORLEVELNM3 as DEPT,
--TO_CHAR(X.APPLYDTM, 'DD-MM-YYYY') AS LABOR_DATE,
to_char(X.APPLYDTM - 7/24,'IW') AS WEEK,
Case when P.NAME = 'US-ABS' then SUM(X.DURATIONSECSQTY/3600.0) else 0 end as ABS_HRS,
Case when P.NAME = 'US-Regular' then SUM(X.DURATIONSECSQTY/3600.0) else 0 end as REG_HRS,
Case when P.NAME = 'US-Overtime' then  SUM(X.DURATIONSECSQTY/3600.0) else 0 end as OT_HRS,
Case when P.NAME = 'US-Doubletime' then SUM(X.DURATIONSECSQTY/3600.0) else 0 end as DBL_HRS,
Case when P.NAME = 'US-VAC' then SUM(X.DURATIONSECSQTY/3600.0) else 0 end as VAC_HRS,
Case when P.NAME = 'US-HOL' then SUM(X.DURATIONSECSQTY/3600.0) else 0 end as HOL_HRS,
SUM(X.DURATIONSECSQTY/3600.0) AS Totals,
Case when P.NAME = 'US-ABS' and SUM(X.WAGEAMT) != 0 then SUM(X.WAGEAMT) else 0 end as ABS_DLRS,
Case when P.NAME = 'US-Regular' and SUM(X.WAGEAMT) != 0 then SUM (X.WAGEAMT) else 0 end as REG_DLRS,
Case when P.NAME = 'US-Overtime' and SUM(X.WAGEAMT) != 0 then SUM(X.WAGEAMT) else 0 end as OT_DLRS,
Case when P.NAME = 'US-Doubletime' and SUM(X.WAGEAMT) != 0 then SUM(X.WAGEAMT) else 0 end as DBL_DLRS,
Case when P.NAME = 'US-VAC' and SUM(X.WAGEAMT) != 0 then SUM(X.WAGEAMT) else 0 end as VAC_DLRS,
Case when P.NAME = 'US-HOL' and SUM(X.WAGEAMT) != 0 then SUM(X.WAGEAMT) else 0 end as HOL_DLRS,
Case when P.NAME in ('USKEANE- Shift Prem','USKEANE- Shift Prem OT','USKEANE- Shift Prem DT') then SUM(X.DURATIONSECSQTY/3600.0) else 0 end as NITE_PREM
from VP_EMPLOYEEV42 VP,
WFCTOTAL X,
PAYCODE P
where 
VP.PERSONID = X.EMPLOYEEID and 
X.PAYCODEID = P.PAYCODEID and
--X.EMPLOYEEID = CA.PERSONID and
--CA.CUSTOMDATADEFID ='153' and
--X.TIMESHEETITEMID = TS.TIMESHEETITEMID and
P.NAME in ('US-Regular','US-Overtime','US-Doubletime','USKEANE- Shift Prem','USKEANE- Shift Prem OT','USKEANE- Shift Prem DT') AND
X.EMPLOYEEID in (select personid from PERSONCSTMDATA where CUSTOMDATADEFID ='154' and PERSONCSTMDATATXT = 'USKEANE')
and VP.PERSONID = '13702' 
and X.APPLYDTM between '28-FEB-19' and '01-MAR-19' 
group by VP.PERSONID, VP.HOMELABORLEVELNM3, P.NAME, to_char(X.APPLYDTM - 7/24,'IW')
ORDER BY VP.PERSONID
  

Комментарии:

1. case Различные результирующие значения выражения должны иметь совместимые типы данных. Что Oracle думает о VARCHAR (15) в сочетании с integer?

2. Удалите запятую из cast(X.WAGEAMT, AS .

3. @jarlh Oracle не нравится it…it это ни капельки не нравится! 😛

4. Спасибо, получил вывод, также я хочу исключить другую часть этого заявления case

5. Вы хотите ELSE NULL ? Или вы хотите добавить WHERE REG_DOLLARS = 0 ? Пожалуйста, покажите больше вашего запроса и ожидаемых результатов.

Ответ №1:

Oracle использует стандарт ANSI || для конкатенации строк:

 CASE WHEN p.NAME = 'US-Regular'
     THEN '$' || CAST(x.WAGEAMT AS VARCHAR(15))
     ELSE '0' END AS REG_DOLLARS
  

Кроме того, все ветви CASE выражения должны иметь один и тот же тип. Поскольку в вашей THEN ветке вы обязуетесь использовать текст, ваша ELSE ветка также должна содержать текст.

Комментарии:

1. Тогда, возможно, в остальной части вашего запроса есть какая-то проблема. Приведенный выше код не должен выдавать эту ошибку.

2. получен вывод и как исключить другой вывод из запроса?

3. Что вы подразумеваете под «устранением» ELSE выходных данных из запроса? В выражении всегда ELSE есть CASE условие, даже если вы его явно не включаете.

4. @TimBiegeleisen . . . Это был не тот ответ, который я увидел, когда отвечал.

5. @GordonLinoff Странно … потому что я не помню, чтобы я это делал на самом деле. Гордон, я люблю тебя больше, чем арахисовое масло, просто не тогда, когда ты дважды публикуешь ответы каждого: P