使用SQL

时间:2017-08-15 14:15:17

标签: sql excel oracle

我真的遇到了这个我正在使用的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

enter image description here

现在,每个日期都有很多日期和许多名称,所以我希望代码能够识别出来。我不确定我尝试改编的代码能否做到。

我现在真的在努力使这个代码工作,或找到可行的代码。任何帮助,将不胜感激。如果需要其他信息,请与我们联系。

修改 enter image description here

我正在尝试查看一个人花费超过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,所以我想摆脱那些数据。

2 个答案:

答案 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

我从选择列表中取出了grouphaving,因为如果它们在那里,则必须包含在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