2017-08-15 8 views
0

私が使用しているこのSQLコードでは、実際に問題が発生しています。私はこれについてポーズを取ってきましたが、本当に答えを得ていません。 this codeを私がしようとしているものに適合させようとしましたが、私は以下のエラーメッセージ画面のスクリーンショットを取得し続けています。 SQLによるクエリからのデータのフィルタリング

enter image description here

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 
は今、多くの日付と、各日付で多くの名前があるので、私はコードがそれを認識します。私が適応しようとしているコードがそうすることができるかどうかはわかりません。

このコードを動作させる方法、または動作するコードを見つける方法については、現時点では本当に苦労しています。どんな助けもありがとう。追加情報が必要な場合はお知らせください。

EDIT enter image description here

私は特定の日付の「PUT」やって自分の時間の75%以上を費やしている人のビューデータをしようとしています。

私がやろうとしているものの例は、(手動で計算)され

マクミランは、彼の名前2017年6月15日に関連した3つの項目があります。それらのうちの1つは「PUT」です。その日付の「PUT」アイテムの合計は132です。その日付の彼の名前に関連するすべての合計は167です.132/167 = 0.79。 0.79> 0.75だから彼のデータをクエリの結果に表示したい。 Maloneには6/15/2017に彼の名前が関連付けられた4アイテムがあります。それらのうちの1つは「PUT」です。 "PUT"の合計は4です.4つの項目の合計は36. 4/36 = 0.11 0.11 < 0.75です。そのデータを取り除きたいと思います。

+1

Oracleデータベースは、Oracleエラーを生成します。適切なタグを追加しました。 –

+0

テーブル構造、サンプルデータ、およびそのデータの期待される結果を、漠然とした記述ではなくフォーマットされたテキストとして表示すると、これは役に立ちます。 selectリストやgroup-byに 'PalletQTY'を含めていますが、実際に意味をなさない集合体でもあります。 'Group'と' PRI_GRP_CD'が本当に同じ列であるのは明らかです。おそらく 'PalletQTY'と' FULL_PLLT_QTY'と同じです。 –

+0

これは書式付きテキストではありません。 [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)を参照してください。 –

答えて

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; 
+0

私はちょうどそれを試みましたが、エラーメッセージをそのまま受け取りました。「ORA-00923:FROMキーワードが期待どおりに見つかりませんでした。」 – Lampoa

+1

@Lampoa - これは、 'ShiftDate'と' TotalCount'の後に列式の間にカンマがないためです。あなたのオリジナルにも欠けています。 ( 'fromデータベース'がそこでやっていたのかどうかはわかりません...)。編集したコードを試してみてください。 –

+0

@AlexPooleねえ、ありがとう!それはうまくいっても、私がしたいことはしません...ここで他の人と話すと、私が探しているものはかなりシンプルですが、SQLの経験はほとんどありません。 – Lampoa

0

別にゴードンが指摘した基本的な構文の問題から、あなたは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 

彼らがそこにいるならば、彼らが持っているので、私は選択リストのうち、palletqtygroupを撮影した:あなたがあなたの元の記述に基づいてダミーデータを使用して、より多くのこのような何かをしたいように見える

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; 
関連する問題