【问题标题】:Group by help required in query按查询中所需的帮助分组
【发布时间】:2019-03-06 14:01:05
【问题描述】:

下面的查询给了我 2 行 9 周的第一行 REG_HRS 的 13 小时和第 2 行 5 小时 OT_HRS

我想要单行中第 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

【问题讨论】:

  • case 表达式的不同结果值必须具有兼容的数据类型。 Oracle 对 VARCHAR(15) 与整数结合有何看法?
  • cast(X.WAGEAMT, AS中删除逗号。
  • @jarlh Oracle 不喜欢它......它一点也不喜欢它! :P
  • 感谢输出,我也想消除这个案例陈述的其他部分
  • 你想要ELSE NULL吗?还是要添加WHERE REG_DOLLARS = 0?请显示更多您的查询和预期结果。

标签: sql oracle group-by case


【解决方案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 分支也应该包含文本。

【讨论】:

  • 那么您查询的其余部分可能有问题。我上面给出的代码不应该抛出这个错误。
  • 得到了输出以及如何从查询中消除 else 输出?
  • 从查询中“消除”ELSE 输出是什么意思? CASE 表达式中总是有一个 ELSE 条件,即使您没有明确包含一个条件。
  • @TimBiegeleisen 。 . .这不是我回复时看到的答案。
  • @GordonLinoff 很奇怪......因为我不记得实际上是在摸索它。戈登,我爱你胜过爱花生酱,而不是当你重复发布每个人的答案时:P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-14
  • 1970-01-01
相关资源
最近更新 更多