2013-10-16 4 views
0

Я пытаюсь использовать пункт OVER, чтобы вернуть одну строку. Мой код выглядит следующим образом:SQL OVER Running Total Select One Record

SELECT SUM(Price) OVER (ORDER BY [InvoiceID] ROWS UNBOUNDED PRECEDING) 
FROM dbo.Sales 
WHERE InvoiceID = 3427 

Я хочу вернуться:

InvoiceID Price 

3427  15.00 

Вместо того, что возвращает это:

InvoiceID Price 

3427 5.00 

3427 10.00 

3427  15.00 

Как я могу получить только одну строку?

+0

Какова ваша структура бэкэнда и таблицы? – kgu87

+0

SQL 2012 Standard –

+0

Есть ли причина, по которой вы не можете обойтись с топ-1, группой и заказом? – kgu87

ответ

1

Не знаете, почему вы используете статью OVER(). Кажется, вам просто нужно:

SELECT InvoiceID, Price = SUM(Price) 
    FROM dbo.Sales 
    WHERE InvoiceID = 3427 -- maybe you want more than just this one? 
          -- if so, leave out the WHERE clause 
    GROUP BY InvoiceID; 
0

Фактически спецификация окна в предложении OVER состоит из трех основных частей: разделов, упорядочение, и кадрирование. Предложение окна рамки (ROWS BETWEEN AND) фильтрует кадр или подмножество строк из раздела окна между двумя указанными разделителями. В вашем запросе фрейм не задан правильно, он должен быть похож на начало раздела (т. Е. UNBOUNDED PRECEDING) и текущую строку (CURRENT ROW). Следующий запрос должен помочь:

SELECT SUM(Price) OVER (ORDER BY [InvoiceID] ROWS BETWEEN UNBOUNDED PRECEDING 
AND CURRENT ROW) 
FROM dbo.Sales 
WHERE InvoiceID = 3427