2013-04-17 5 views
3

Я искал какое-то время, и я не могу найти ответ на этот вопрос (возможно, я не ищу правильные термины или что-то в этом роде). В принципе, у меня есть база данных, которая имеет любое количество записей за дату. Мне нужно взять сумму последних X дней, содержащих записи (игнорируя дни, у которых нет записей). Я знаю, как найти суммы за каждый день.SQL Сумма последнего X Сумма записей

Скажет, у меня есть таблица под названием "Выход":

UnitID Date  TestTime NumMeasured NumPassing 
1  2013-04-05 10:15  25   3 
2  2013-03-31 10:12  30   1 
3  2013-03-30 10:12  26   2 
4  2013-03-29 10:30  11   1 
5  2013-03-31 10:20  6   2 
6  2013-04-05 10:30  5   0 

Я затем использовать этот запрос:

SELECT DISTINCT 
    Date, 
    (
     SELECT SUM([NumMeasured]) 
     FROM [dbo].[Yield] T1 
     WHERE T1.Date = T2.Date 
    ) AS 'NumMeasured', 
    (
     SELECT SUM([NumPassing]) 
     FROM [dbo].[Yield] T1 
     WHERE T1.Date = T2.Date 
    ) AS 'NumPassing' 
FROM [dbo].[Yield] T2 

Для того, чтобы получить полное прохождение/измеренное в день:

Date  NumMeasured NumPassing 
2013-03-29  11   1 
2013-03-30  26   2 
2013-03-31  36   3 
2013-04-05  30   3 

Мне понадобился бы запрос, который я мог бы назвать по дате (например, я называю это для 4/05), который получает последние X (скажем, 100) дней, что c получать записи и возвращать сумму столбцов NumMeasured и NumPassing за это много дней. Я не могу заставить эту часть работать, я постоянно сталкиваюсь с проблемами SQL, с которыми у меня недостаточно опыта для решения. Я ищу что-то вроде

SELECT 
    (
     SELECT TOP 100 SUM(T3.[NumMeasured]) 
     FROM T3 
     WHERE T3.Date <= '4/05/2013' 
     ORDER BY T3.Date 
    ) AS 'NumMeasured', 
    (
     SELECT TOP 100 SUM(T3.[NumPassing]) 
     FROM T3 
     WHERE T3.Date <= '4/05/2013' 
     ORDER BY T3.Date 
    ) AS 'NumPassing', 
    (
     SELECT DISTINCT 
      Date, 
      (
       SELECT SUM([NumMeasured]) 
       FROM [PhaseNoiseMonitoring].[dbo].[Yield] T1 
       WHERE T1.Date = T2.Date 
      ) AS 'NumMeasured', 
      (
       SELECT SUM([NumPassing]) 
       FROM [PhaseNoiseMonitoring].[dbo].[Yield] T1 
       WHERE T1.Date = T2.Date 
      ) AS 'NumPassing' 
     FROM [PhaseNoiseMonitoring].[dbo].[Yield] T2 
    ) 
AS T3 

Ожидаемый запрос возвратит:

NumMeasured NumPassing 
103   9 

Я понимаю, что это совершенно неправильно, но я не могу понять, как заставить его работать.

+1

Если я что-то не хватает, кажется мне «GROUP BY» пункт может упростить вашу жизнь много. – hometoast

+0

, так что вам нужны суммы за последние 100 дат .. не обязательно суммы на даты в течение 100 дней? – hometoast

ответ

1

Вот идея с использованием связанных подзапросов:

with bydays as (<your query here>) 
select bd.*, 
     (select sum(NumMeasured) from (select top 100 * from bydays bd2 where bd2.date <= bd.date order by date desc) t 
     ) as Measured100, 
     (select sum(NumPassingd) from (select top 100 * from bydays bd2 where bd2.date <= bd.date order by date desc) t 
     ) as Measured100 
from bydays 
+0

Спасибо, это сделало именно то, что мне было нужно (помимо нескольких опечаток), оценить быстрый ответ, я раньше не использовал коррелированные подзапросы, но это кажется намного проще, чем материал, в который я попадал. –

+0

@ Gordon-Linoff Как насчет того, когда вам нужно заполнить несколько значений (например, группой, например, с помощью UnitID в примере Мэтта выше)? – CRSouser

0

Чтобы получить свои последние 100 дат,

SELECT TOP(100) DISTINCT date FROM yield ORDER BY date desc 

Вы можете упростить свой первый запрос с чем-то же просто, как

SELECT date, SUM(passing) as numpassing, SUM(Measured) as nummeasured 
FROM yield 
GROUP BY date 

Если вам нужна сумма от этого момента до 100 дней назад

SELECT SUM(passing) as npassing, SUM(measured) as nmeasured 
FROM yield 
WHERE date >= DATEADD(d,100,CURRENT) 

И если вам нужна сумма от последних 100 дат

SELECT SUM(passing) as npassing, SUM(measured) as nmeasured 
FROM yield 
WHERE date IN (SELECT TOP 100 date FROM yield WHERE date <= '04/05/2013' ORDER BY date desc) 
Смежные вопросы