使用SQL过滤来自查询的数据

我真的遇到了我正在使用的这个SQL代码的问题。 我一直在这个,但没有真正得到答案。 我试图使这个代码适应我正在尝试做的事情,但我不断得到下面抓取的错误消息屏幕的屏幕截图。

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 

在这里输入图像说明

现在,每个date都有许多date和许多名字,所以我想让代码认识到这一点。 我不知道我正在尝试适应的代码是否能够做到这一点。

在这个问题上,我非常努力的工作,或者find可能有用的代码。 任何帮助,将不胜感激。 让我知道是否需要额外的信息。

编辑 在这里输入图像说明

我正在尝试查看一个人在超过75%的时间内在某个特定date做“PUT”的情况。

我想要做的一个例子是(手动计算)

McMillan有3件与他的名字6/15/2017相关的项目。 其中1个是“PUT”。 这个date的“PUT”项目的总数是132.与他的名字相关的所有事情的总和是167。132/167 = 0.79。 0.79> 0.75所以我想他的数据显示在我的查询结果。 马龙在6/15/2017有4个与他的名字相关的项目。 其中1个是“PUT”。 “PUT”的总和是4.所有4个项目的总和是36.4 / 36 = 0.11 0.11 <0.75,所以我想摆脱这个数据。

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; 

除了Gordon指出的基本语法问题,你似乎混淆了count()sum()聚合函数。 您可以同时执行这两个操作,但是从描述中您可以看到托盘的总数,而不是组types的条目数。

你似乎想要更像这样的东西,根据你原来的描述使用虚拟数据:

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

我select了一个palletqty ,把它们从select列表中删除,因为如果它们在那里,它们必须包含在分组中,这样就不会在正确的层次上进行计数和求和了。

这应该给你每个人每天/他们有logging的一个输出行。

如果要排除百分比不符合某个阈值的结果行,则可以添加having子句:

 ... group by loginid, shiftnumber, shiftdate having sum(case when pri_grp_cd = 'PUT' then palletqty else 0 end) / sum(palletqty) > 0.8; 

您可能更愿意避免重复某些条款; 你可以将count / sum / group移到子查询(内联视图)中,然后用where子句而不是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;