2015-03-20 4 views
2

Этот запрос работает безупречно на SQL Server 2014 (http://sqlfiddle.com/#!6/19de4/1), но у меня проблемы с версией 2008 года, жалуется «Неправильный синтаксис рядом с порядком». Что мне не хватает?SQL Server 2008 - ошибка с использованием OVER с GROUP BY

CREATE TABLE t (id BIGINT, cliente VARCHAR(100), vendas FLOAT); 

INSERT INTO t VALUES (1, 'vitor', 234.3); 
INSERT INTO t VALUES (2, 'emerson', 456.2); 
INSERT INTO t VALUES (3, 'thiago', 6789.3); 
INSERT INTO t VALUES (4, 'john', 5423.0); 
INSERT INTO t VALUES (5, 'fulano', 3467.8); 

SELECT *, CASE WHEN vendas_agrupadas <= 0.7 THEN 'A' ELSE 
(CASE WHEN vendas_agrupadas <= 0.9 THEN 'B' ELSE 'C' END) END 
AS "Grupo ABC" FROM (
    SELECT *, SUM(vendas) OVER (ORDER BY vendas desc) 
    /(SUM(vendas) OVER()) AS vendas_agrupadas FROM t) asdf; 
+0

Добавление данных в SQL Fiddler упростило работу - спасибо! – CindyH

+0

@CindyH стыдно, что у него нет версии SQL Server 2008, но сайт отличный –

ответ

0

SQL Server 2008 не поддерживает кумулятивные суммы непосредственно следующая версия с подзапрос должен делать то, что вы хотите:.

SELECT *, 
     (CASE WHEN vendas_agrupadas <= 0.7 THEN 'A' 
      WHEN vendas_agrupadas <= 0.9 THEN 'B' 
      ELSE 'C' 
     END) as "Grupo ABC" 
FROM (SELECT *, 
      (SELECT SUM(vendas) 
       FROM t t2 
       WHERE t2.vendas >= t.vendas 
      )/(SUM(vendas) OVER()) AS vendas_agrupadas 
     FROM t 
    ) asdf; 

Некоторые ноты:

  • Это может не дать точно такие же результаты, если имеются дублированные значения vendas.
  • case может принимать несколько when, поэтому вам не нужны вложенные операторы case.
+0

Я тестировал также с дублирующимися значениями вендов и, похоже, хорошо работает. Огромное спасибо. –

Смежные вопросы