2

返された値の上位 80% を返す結果を取得しようとしています。SQL DB for i を使用すると、このTOP句は機能しません。ネストされた select ステートメントで使用する例をいくつか見てきCount()ましたが、それが既に作成したクエリにどのように適合するかはわかりません。私はすでに 2 つのサブクエリを持っているので、それがどのように適合するか、または機能するかどうかを調べる必要があります。これが私がこれまでに持っているものです:

Select  CATEGORY,
    LINE,
    ITEM#,
    Units
From    D*****.*****ST
Inner Join  (Select DW******.*****FO.ITEM,
                    Sum (SALES_UNITS) As Units,
                    CATEGORY
            From    DW*******.*****FO
            Inner Join  (Select CATEGORY,
                                DW****.******RY.ITEM
                         From   DW****.******RY
                         Where  CATEGORY='BRAKES') As CA***ST
            On DW*******.*****FO.ITEM=CA*****.***M              
            Where   ("DATE" between current date -1 years and current date) And (SALES > 5.00)
            Group By    DW*******.******O.ITEM,
                        CATEGORY) As Units_List
On      DW****.*****ST.**EM#=U*********.***M
Group By    CATEGORY,
            LINE,
            ITEM#,
            Units
Order By    Units DESC             

したがって、ここのどこかに、Count()私が想定している入れ子になった句があるでしょう。それが物事の壮大な計画のどこに当てはまるかはわかりません。私はまだ中間 SQL のいくつかを学んでいるので、質問が少し単純に思えたら申し訳ありません。

4

3 に答える 3

2

ウィンドウ関数を使用することをお勧めします。あなたの質問を理解するのは難しいと思いますが、アイデアは次のとおりです。

select t.*
from (select t.*,
             row_number() over (order by units desc) as seqnum,
             count(*) over () as totnum
      from (<view that gets you all the data you want>
           ) t
     ) t
 where seqnum <= 0.8*totnum

アイデアは、ウィンドウ関数を使用して合計数とランキングを取得することです (私は を使用row_number()rank()ます。同点の場合はより適切かもしれません)。whereその後、句を使用して必要な値を取得できます。

于 2013-01-22T14:24:02.573 に答える
1

まず第一に、副選択は不要であり、単純な結合ステートメントを使用すると読みやすくなります。サブクエリを折りたたむと、count(*) を使用した手法が組み込みやすくなります。

次に、既存のクエリにカウントを追加する際の問題があります。すでに count を使用している場合、join と count を追加すると、両方の count が台無しになる可能性があります。これは、join がデカルト積を作成し、count と sum が間違った答えになる可能性があるためです。count も sum もまだないので、その落とし穴について心配する必要はありません。

Select  RY.CATEGORY, ST.LINE, ST.ITEM#, FO.Units
From    D*****.*****ST ST
  Inner Join DW*******.*****FO FO On ST.ITEM# = FO.ITEM
  Inner Join DW****.******RY RY On FO.ITEM = RY.ITEM
    And ("DATE" between current date -1 years and current date)
    And (SALES > 5.00)
  Inner Join D*****.*****ST ST_J On ST.LINE = ST_J.LINE And ST.ITEM# = ST_J.ITEM#
  Inner Join DW*******.*****FO FO On ST_J.ITEM# = FO_J.ITEM
Where FO_J.Units >= FO.Units
Group By    RY.CATEGORY, ST.LINE, ST.ITEM#, FO.Units
Having      Count(FO_J.Units) < 0.8 * (Select Count(*)
      From D*****.*****ST ST_J On ST.LINE = ST_J.LINE And ST.ITEM# = ST_J.ITEM#
      Inner Join DW*******.*****FO FO On ST_J.ITEM# = FO_J.ITEM)
Order By    FO.Units DESC   
于 2013-01-22T14:50:29.483 に答える
0

これは一般的なOracleの例であり、おそらくいくつかの助けになります。使用しているデータベースがわかりません。

SELECT deptno, ename, sal
     , PERCENT_RANK() OVER (PARTITION BY deptno ORDER BY sal DESC) AS prcnt
  FROM scott.emp
ORDER BY prcnt DESC, sal, ename
/

DEPTNO      ENAME   SAL     PRCNT
--------------------------------
10          MILLER  1300    1
...
20          ADAMS   1100    0.75
30          MARTIN  1250    0.6
...
10          CLARK   2450    0.5
...
30          TURNER  1500    0.4
于 2013-01-22T14:45:27.707 に答える