我真的遇到了这个我正在使用的SQL代码的问题。我一直在谈论这个,但没有真正得到答案。我试图让this code适应我想要做的事情,但我一直抓住下面抓到的错误消息屏幕的屏幕截图。
SELECT LoginID, ShiftNumber, PalletQTY, Group, ShiftDate
FROM Database
COUNT(PalletQTY) AS TotalCount
SUM(IF(Group='PUT',1,0)) AS ActiveCount,
ROUND((SUM(IF(TALLY_TRAN_MSTR.PRI_GRP_CD='PUT',1,0))*100/COUNT(TALLY_TRAN_MSTR.FULL_PLLT_QTY)),2) AS PctActive
FROM WBR_RW.TALLY_TRAN_MSTR TALLY_TRAN_MSTR
现在,每个日期都有很多日期和许多名称,所以我希望代码能够识别出来。我不确定我尝试改编的代码能否做到。
我现在真的在努力使这个代码工作,或找到可行的代码。任何帮助,将不胜感激。如果需要其他信息,请与我们联系。
我正在尝试查看一个人花费超过75%的时间来做数据" PUT"对于特定日期。
我尝试做的一个例子是(手动计算)
McMillan有3件与他的名字相关的信息6/15/2017。其中一个是" PUT"。 " PUT"的总和该日期的项目为132.与该日期的姓名相关的所有事项的总和为167. 132/167 = 0.79。 0.79> 0.75所以我希望他的数据显示在我的查询结果中。 Malone在6/15/2017有4件与他的名字相关的物品。其中一个是" PUT"。 " PUT"总共为4.所有4个项的总和为36. 4/36 = 0.11 0.11< 4。 0.75,所以我想摆脱那些数据。
答案 0 :(得分:2)
Oracle不支持if()
。使用适当的Oracle语法。我认为查询看起来应该更像这样:
SELECT LoginID, ShiftNumber, PalletQTY, "Group", ShiftDate,
COUNT(PalletQTY) AS TotalCount,
SUM(CASE WHEN "Group" = 'PUT' THEN 1 ELSE 0 END) AS ActiveCount,
ROUND(SUM(CASE WHEN TALLY_TRAN_MSTR.PRI_GRP_CD = 'PUT' THEN 1 ELSE 0 END)*100 /
COUNT(TALLY_TRAN_MSTR.FULL_PLLT_QTY), 2) AS PctActive
FROM WBR_RW.TALLY_TRAN_MSTR TALLY_TRAN_MSTR
GROUP BY LoginID, ShiftNumber, PalletQTY, "Group", ShiftDate;
答案 1 :(得分:0)
除了Gordon指出的基本语法问题之外,您似乎混淆了sum()
和-- CTE for dummy data
with tally_tran_mstr (loginid, shiftdate, shiftnumber, pri_grp_cd, palletqty) as
(
select 'Steve', date '2017-06-15', 1, 'PUT', 40 from dual
union all select 'Steve', date '2017-06-15', 1, 'PUT', 80 from dual
union all select 'Steve', date '2017-06-15', 1, 'PUT', 45 from dual
union all select 'Steve', date '2017-06-15', 1, '???', 7 from dual
union all select 'Steve', date '2017-06-15', 1, '???', 5 from dual
union all select 'Steve', date '2017-06-15', 1, '???', 3 from dual
union all select 'Steve', date '2017-06-15', 1, '???', 1 from dual
)
-- end of CTE for dummy data
select loginid, shiftnumber, shiftdate,
count(*) as totalcount,
count(case when pri_grp_cd = 'PUT' then 1 end) as activecount,
round(100 * count(case when pri_grp_cd = 'PUT' then 1 end) / count(*), 2)
as pctactivecount,
sum(palletqty) as totalqty,
sum(case when pri_grp_cd = 'PUT' then palletqty else 0 end) as activeqty,
round(100 * sum(case when pri_grp_cd = 'PUT' then palletqty else 0 end) /
sum(palletqty), 2) as pctactiveqty
from tally_tran_mstr
group by loginid, shiftnumber, shiftdate;
LOGIN SHIFTNUMBER SHIFTDATE TOTALCOUNT ACTIVECOUNT PCTACTIVECOUNT TOTALQTY ACTIVEQTY PCTACTIVEQTY
----- ----------- ---------- ---------- ----------- -------------- ---------- ---------- ------------
Steve 1 2017-06-15 7 3 42.86 181 165 91.16
聚合函数。您可以同时执行这两项操作,但根据您的说明,您对托盘的总数量感兴趣,而不是组类型的条目数。
您似乎想要更像这样的东西,根据原始描述使用虚拟数据:
palletqty
我从选择列表中取出了group
和having
,因为如果它们在那里,则必须包含在group-by子句中,这不包括计数和总结在正确的水平。
这应该为每个人/他们有记录的每个人提供一行输出。
如果要排除百分比未达到某个阈值的结果行,则可以添加...
group by loginid, shiftnumber, shiftdate
having sum(case when pri_grp_cd = 'PUT' then palletqty else 0 end) /
sum(palletqty) > 0.8;
子句:
where
您可能更愿意避免重复某些条款;您可以将count / sum / group移动到子查询(内联视图),然后使用having
子句而不是select loginid, shiftnumber, shiftdate, totalcount, activecount,
round(100 * activecount / totalcount, 2) as pctactivecount,
totalqty, activeqty, round(100 * activeqty / totalqty, 2) as pctactiveqty
from (
select loginid, shiftnumber, shiftdate,
count(*) as totalcount,
count(case when pri_grp_cd = 'PUT' then 1 end) as activecount,
sum(palletqty) as totalqty,
sum(case when pri_grp_cd = 'PUT' then palletqty else 0 end) as activeqty
from tally_tran_mstr
group by loginid, shiftnumber, shiftdate
)
where activeqty / totalqty > 0.8;
子句对其进行过滤:
NSCollectionView