2014-12-17 2 views
0

В моем запросе я в настоящее время работает, чтобы получить общую сумму полей в заданном диапазоне дат, я также хочу, чтобы запрос показывал итоговые значения за один день ,SQL Server - Получайте еженедельные и ежедневные итоги в одном запросе

Например мой текущий результат таков:

ID, UserID, uname, totals 
1  1  admin 3 
2  3  test 6 
3  4  user 2 

Я хочу, чтобы мой результат так:

ID, UserID, uname, totals, todaytotal 
1  1  admin 3,  1 
2  3  test 6,  2 
3  4  user 2,  2 

Данные здесь является случайным, но только для визуальной цели.

Итоговые получает сумму количества из таблицы с именем ActivityLog

мой запрос, как это, работая с диапазоном дат:

SELECT al.UserID, 
od.CardNumber as uname, 
Sum(isnull(cast(ActualQuantity as float),0)) totals 
from ActivityLog al , OperatorDetail od 
WHERE 
od.ID = al.UserID AND 
StartDateTime >= '2014-08-24 00:00:00.000' 
AND EndDateTime <= '2014-08-31 23:59:59.000' 
group by al.UserID, od.CardNumber 
order by od.CardNumber 

Это то, что я пытался попробовать получить итоговые суммы от определенной даты (todaytotal на 2014-08-29)

SELECT al.UserID, 
od.CardNumber as uname, 
Sum(isnull(cast(ActualQuantity as float),0)) totals, 

(select Sum(isnull(cast(ACTL.ActualQuantity as float),0)) totaltoday 
from ActivityLog ACTL, OperatorDetail OPD 
WHERE 
ACTL.UserID = OPD.ID 
AND 
al.StartDateTime >= '2014-08-29 00:00:00.000' -- same date (one day) 
AND al.EndDateTime <= '2014-08-29 23:59:59.000' -- same date (one day) 
GROUP BY ACTL.UserID, OPD.CardNumber 
) as todaytotal 

from ActivityLog al , OperatorDetail od 
WHERE 
od.ID = al.UserID AND 
StartDateTime >= '2014-08-24 00:00:00.000' 
AND EndDateTime <= '2014-08-31 23:59:59.000' 
group by al.UserID, od.CardNumber, al.StartDateTime, al.EndDateTime 
order by od.CardNumber 

с этим я получаю эту ошибку:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

Как я могу это достичь?

ответ

1

Я предполагаю, что ваш запрос синтаксически правильный.

Запись из памяти: Попробуйте

SELECT al.UserID, 
    od.CardNumber as uname, 
    Sum(isnull(cast(ActualQuantity as float),0)) totals, 
    Sum(case when cast(StartDateTime as date) = cast(getdate() as date) then isnull(cast(ActualQuantity as float),0)) else 0 end) TodayTotals 
from ActivityLog al , OperatorDetail od 
WHERE 
    od.ID = al.UserID AND 
    StartDateTime >= '2014-08-24 00:00:00.000' 
    AND EndDateTime <= '2014-08-31 23:59:59.000' 
group by al.UserID, od.CardNumber 
order by od.CardNumber 

CAST для date работы SQL SERVER> = 2008

1

Вы можете использовать условную агрегацию:

select al.UserID, 
     od.CardNumber as uname, 
     isnull(Sum(cast(ActualQuantity as float)), 0) totals, 
     isnull(Sum(case when StartDateTime >= '2014-08-31' and StartDateTime < '2014-09-01' 
         then cast(ActualQuantity as float) 
        end), 0)) totals, 
from ActivityLog al join 
    OperatorDetail od 
    on od.ID = al.UserID 
where StartDateTime >= '2014-08-24' AND EndDateTime < '2014-09-01' 
group by al.UserID, od.CardNumber 
order by od.CardNumber ; 

Обратите внимание, что я изменил дату арифметику. Вместо использования <= для верхней границы используйте < на следующую дату. Тогда вам не нужно беспокоиться ни о чем, что происходит за долю секунды до полуночи.

Я установил синтаксис join. Кроме того, я положил isnull()за пределамиsum(), а не изнутри. Это даст значение 0, даже если нет совпадений с case. И вы должны хранить ActualQuantity как числовое значение, поэтому cast() не нужно.

Наконец, если вы хотите, чтобы это для текущей даты:

 isnull(Sum(case when StartDateTime >= cast(getdate() as date) and StartDateTime < cast(getdate() + 1 as date) 
         then cast(ActualQuantity as float) 
        end), 0)) totals, 

ли быть уверенным, что текущая дата находится в диапазоне, используемом для where.

+0

я не получил эту линию вашей, простите меня, если я задание nooby вопроса: StartDateTime> = cast (getdate() as date) и StartDateTime Codeek

+1

@Codeek. , , В выражении 'case' это не имеет значения. Однако в разделе 'where' это делается. Вы хотите избежать использования столбцов в качестве аргументов функций в предложениях 'where' и' on', поскольку это предотвращает использование индексов. –

+0

Thanx a load :) Узнал что-то новое :) – Codeek

1

Ошибка вы получаете, потому что ваш подзапрос вычисления суммы на сегодня общая сумма возвращается несколько значений для столбца. зачем создавать полностью независимый подзапрос. Я не нахожу нужды в подзапросе, чтобы присоединиться к нему с OLD, просто используйте данные, доступные извне.Вы можете сделать это, как этот

SELECT al.UserID, 
od.CardNumber as uname, 
Sum(isnull(cast(ActualQuantity as float),0)) totals, 

(select Top 1 Sum(isnull(cast(ACTL.ActualQuantity as float),0)) totaltoday 
from ActivityLog ACTL 
WHERE 
ACTL.UserID = a1.ID   --OPD.ID Commented this just use a1's id 
AND 
CAST (StartDateTime AS DATETIME) = GETDATE() -- logically today's date should be GETDATE isn't it? 
) as todaytotal 

from ActivityLog al , OperatorDetail od 
WHERE 
od.ID = al.UserID AND 
StartDateTime >= '2014-08-24 00:00:00.000' 
AND EndDateTime <= '2014-08-31 23:59:59.000' 
group by al.UserID, od.CardNumber, al.StartDateTime, al.EndDateTime 
order by od.CardNumber 

Я скажу это, однако, ваш путь не очень эффективным, использовать то, что Гордана Linoff предложил

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