別にゴードンが指摘した基本的な構文の問題から、あなたはcount()
と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
を撮影した:あなたがあなたの元の記述に基づいてダミーデータを使用して、より多くのこのような何かをしたいように見える
group-by句に含めることができます。これは適切なレベルで集計と集計を行いません。
これは、1日ごとに1人の出力を1行にまとめ、レコードをシフトする必要があります。
あなたは割合がある閾値を満たしていない結果の行を除外したい場合、あなたはhaving
句を追加することができます
...
group by loginid, shiftnumber, shiftdate
having sum(case when pri_grp_cd = 'PUT' then palletqty else 0 end)/
sum(palletqty) > 0.8;
あなたは用語のいくつかの繰り返しを避けることを好むことを。あなたは、サブクエリ(インライン・ビュー)に数/合計/グループを移動し、代わりにhaving
句のwhere
句であることをフィルタリングすることができます。
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;
Oracleデータベースは、Oracleエラーを生成します。適切なタグを追加しました。 –
テーブル構造、サンプルデータ、およびそのデータの期待される結果を、漠然とした記述ではなくフォーマットされたテキストとして表示すると、これは役に立ちます。 selectリストやgroup-byに 'PalletQTY'を含めていますが、実際に意味をなさない集合体でもあります。 'Group'と' PRI_GRP_CD'が本当に同じ列であるのは明らかです。おそらく 'PalletQTY'と' FULL_PLLT_QTY'と同じです。 –
これは書式付きテキストではありません。 [this](http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-question/285557#こちらをご覧ください。 285557)、[this](https://stackoverflow.com/help/mcve)、[this](https://stackoverflow.com/help/formatting)を参照してください。 –