2016-09-21 13 views
1

製品によって販売された総量で表を作成しようとし、3番目に多い販売数量の製品を日付別にセグメント化します。以下のクエリは注文日レベルで仕切られ、すべての製品IDを返し、すべてのだろうRANK OVER関数で列名が無効です。SQL

select 
    RANK() OVER (PARTITION BY t3.orderdate order by t3.total_amt_ordered) as ranking, 
    t3.productid, 
    t3.orderdate, 
    t3.total_amt_ordered 
from 
    (select 
     t2.productid, 
     t1.orderdate, 
     SUM(t2.orderqty) as total_amt_ordered 
    from 
     saleslt.salesorderheader t1 
    inner join 
     saleslt.salesorderdetail t2 on t1.salesorderid = t2.salesorderid 
    group by 
     productid, orderdate) t3 
where 
    ranking = 3; 
+0

あなたの期待は何ですか? – Teja

答えて

1

:私のRANK() OVER文の別名のエラー

無効な列名

を取得しておいてください3位にランクインした。

SELECT * FROM 
    (
     select 
       DENSE_RANK() OVER (PARTITION BY t3.orderdate order by 
       t3.total_amt_ordered DESC) as ranking, 
       t3.productid, 
       t3.orderdate, 
       t3.total_amt_ordered 
      from ( 
       select 
         t2.productid, 
         t1.orderdate, 
         SUM(t2.orderqty) as total_amt_ordered 
        from 
         saleslt.salesorderheader t1 
        inner join 
         saleslt.salesorderdetail t2 
        on t1.salesorderid=t2.salesorderid 
        group by productid, orderdate) t3 
    ) Z 
where Z.ranking= 3; 
+0

ありがとう! whereステートメントでエラーが発生しました。それを含めることはできますか? –

+0

どのようなエラーが表示されますか?また、私のクエリはwhere節なしで動作しますか?もしそうなら、あなたが見ているアウトプットの最後の列は何ですか? – Teja

+0

where節なしでは動作しません。表示:メッセージ102、レベル15、状態1、行48 ';'の近くの構文が正しくありません。 –

0

あなたがこの方法を使用することができますが、派生テーブル/ CTEせずに直接使用することはできませんので、あなたは、RANKの前に評価されている状態

;WITH cte 
AS (SELECT 
    RANK() OVER (PARTITION BY t3.orderdate ORDER BY t3.total_amt_ordered) AS ranking, 
    t3.productid, 
    t3.orderdate, 
    t3.total_amt_ordered 
FROM (SELECT 
    t2.productid, 
    t1.orderdate, 
    SUM(t2.orderqty) AS total_amt_ordered 
FROM saleslt.salesorderheader t1 
INNER JOIN saleslt.salesorderdetail t2 
    ON t1.salesorderid = t2.salesorderid 
GROUP BY productid, 
      orderdate) t3) 
SELECT 
    * 
FROM cte 
WHERE ranking = 3; 
+0

これはすべてのヌルを与えます。 –

1

にランク付けクエリと同じように使用することはできませんSUMの後にも計算され、このクエリの結果となります。

select * 
from 
    ( select 
     t2.productid, 
     t1.orderdate, 
     SUM(t2.orderqty) as total_amt_ordered, 
     RANK() 
     OVER (PARTITION BY t1.orderdate 
       order by SUM(t2.orderqty)) as ranking 
    from 
     saleslt.salesorderheader t1 
    inner join 
     saleslt.salesorderdetail t2 on t1.salesorderid = t2.salesorderid 
    group by 
     productid, orderdate 
) t3 
where 
    ranking = 3; 
+0

これは私にヌルを与えます。 –

+0

@CameronWarren:NULLs?おそらく 'DENSE_RANK'(あるいは' ROW_NUMBER')に切り替える必要があります – dnoeth

関連する問題