2016-09-21 9 views
1

Попытка создать таблицу с общим количеством, продаваемым по продукту, и выбрать третье по величине продаваемое изделие с разбивкой по дате. Продолжайте получать ошибкуНедопустимое имя столбца с функцией RANK OVER SQL

Недопустимое имя столбца

псевдонима для моего RANK() OVER заявления:

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

Ниже запрос будет возвращать все идентификаторы продуктов секционированных на заказ уровне даты и все которые оцениваются в три раза.

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 clause. Отображение: Msg 102, Level 15, State 1, Line 48 Неправильный синтаксис рядом с ';'. –

0

Вы можете использовать этот способ, Вы не можете использовать ранжирование запросов и так же в где условие

;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

WHERE вычисляется перед RANK, так что вы не можете использовать его непосредственно без производной таблицы/КТР , но он также рассчитывается после 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

Это дает мне nulls. –

+0

@CameronWarren: NULL? Вероятно, вам нужно переключиться на 'DENSE_RANK' (или, возможно, на' ROW_NUMBER') – dnoeth