2017-01-11 4 views
0

Я пытаюсь вычислить текущее общее количество по вычисленному полю в SQL Server. У меня есть две колонки, которые выглядят следующим образом:Вычислить общее количество вычисленных столбцов SQL Server

TimeElapsed | CurrentValue 
    0  |  0.003 
    1  |  0.002 
    2  |  0.001 

Я ищу это:

TimeElapsed | CurrentValue | CummuSum 
    0  |  0.003 |  0.003 
    1  |  0.002 |  0.005 
    2  |  0.001 |  0.006 

Чтобы получить первую таблицу, я написал следующий запрос:

select 
    floor(datediff(hh,date1,date2)) as TimeElapsed, 
    cast(count(date2) as float)/(select count(col3) from table) as CurrentValue 
from 
    table 
group by 
    floor(datediff(hh,date1,date2)) 
order by 
    floor(datediff(hh,date1,date2)) asc; 

первый оператор вычисляет разницу во времени двух отдельных столбцов и использует функцию floor для удаления минут или секунд. Итак, если у меня есть разница в 1 час 30 минут, все, о чем я забочусь, это 1 час. Второй оператор в части выбора вычисляет процент элементов в этом диапазоне по сравнению с общим количеством элементов. Значения в Date2 могут быть NULL.

Я думал, что abut пишет подзапрос, но когда я пытаюсь суммировать по столбцу CurrentValue, я всегда получаю ошибку Cannot perform an aggregate function on an expression containing an aggregate or a subquery..

Может ли кто-нибудь обратиться за помощью, чтобы получить общее количество?

+0

какая версия SQL-сервер вы используете? – Tanner

+0

В SQL Server 2012+ вы можете использовать функцию окна 'SUM() OVER (ORDER BY ...) для достижения этого, но сначала вам нужно поместить ваш текущий запрос в подзапрос (так что вы не пытаетесь выполняйте агрегат по совокупности). – ZLK

+0

@Tanner На самом деле это Azure SQL, база данных размещается в облаке. –

ответ

1

Если вы используете SQL Server 2012+, используя SUM() с OVER() Clause, вы сможете достичь общей суммы.

Например,

SELECT TimeElapsed, 
     CurrentValue, 
     CummuSum = SUM(CurrentValue) OVER (ORDER BY TimeElapsed) 
FROM 
(
    SELECT TimeElapsed = DATEDIFF(HOUR, Date1, Date2), 
      CurrentValue = CAST(COUNT(Date2) AS FLOAT)/(SELECT COUNT(Col3) FROM myTable) 
    FROM myTable 
    GROUP BY DATEDIFF(HOUR, Date1, Date2) 
) T 
ORDER BY TimeElapsed; 

Альтернативный способ достижения этой цели (который будет работать в SQL Server 2008), использует КТР с подзапроса в операторе отбора.

Например,

WITH CTE AS 
(
    SELECT TimeElapsed = DATEDIFF(HOUR, Date1, Date2), 
      CurrentValue = CAST(COUNT(Date2) AS FLOAT)/(SELECT COUNT(Col3) FROM myTable) 
    FROM myTable 
    GROUP BY DATEDIFF(HOUR, Date1, Date2) 
) 
SELECT TimeElapsed, 
     CurrentValue, 
     CummuSum = (SELECT SUM(CurrentValue) FROM CTE WHERE TimeElapsed <= C.TimeElapsed) 
FROM CTE C; 
+0

Это близко, но результаты не совсем то, что я ищу. Как я могу сгруппировать их по переменной TimeElapsed ? Я попытался добавить предложение 'group by', но не увенчался успехом. –

+0

@JuanDaza Я отредактировал его так же, как и ваш запрос (минус пол на датах, так как датифик всегда возвращает целое число). – ZLK

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