none
Выборка с вычислениями в MS SQL Server 2012 RRS feed

  • Вопрос

  • Добрый день.

    В базе имеются следующие таблицы:

     Counter (CounterID, PlaceID, CounterModel, CounterNote);

     Testimony (TesID, TimeDate, CounterID, CounterData);

     Location (PlaceID, PlaceName).

    Необходимо вычислить разность показателей CounterData между двумя моментами времени TimeDate для каждого счётчика CounterData. Информацию вывести в виде: PlaceName, CounterNote, CounterData.

    Ещё нужно вычислить сумму полученного столбца CounterData, но это, я полагаю, можно сделать уже после, с помощью хранимой процедуры

    Помогите, пожалуйста, сам не справлюсь. Заранее благодарю

    4 июня 2012 г. 11:07

Ответы

  • If all you need is to see the difference between CounterData at @StartDate and @EndDate, then

    ;with cteStart as (select CounterID, CounterData from Testimony where TimeDate = @StartDate), 
    
    cteEnd as (select CounterID, CounterData from Testimonty where TimeDate = @EndDate)
    
    SELECT L.PlaceName, C.CounterNote, 
    E.CounterData - S.CounterData as [Difference]
    from cteStart S inner join cteEnd E ON S.CounterID = E.CounterID
    
     T INNER JOIN Counter C on S.CounterID = C.CounterID inner join Location L on C.PlaceID = L.PlaceID
    I assume that you will always have data for the two passed times, if not, we may want to use FULL JOIN between cteStart and cteEnd and then join the result to the rest of the tables.


    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog


    • Изменено Naomi N 5 июня 2012 г. 12:49
    • Помечено в качестве ответа J.Lion 5 июня 2012 г. 15:40
    5 июня 2012 г. 12:49

Все ответы

  • Необходимо вычислить разность показателей CounterData между двумя моментами времени TimeDate для каждого счётчика CounterData.

    что за 2 момента времени? 2 любых момента времени? и что значит для каждого CounterData?

    у вас какие-то сложности с элементарной постановкой задачи


    http://www.t-sql.ru

    4 июня 2012 г. 11:51
    Модератор
  • with cte
    as
    (
    select row_number() over ( partition by CounterID order by TimeDate desc ) id, l.PlaceName, c.CounterNote, t.CounterID, t.CounterData  
      from Testimony t
        inner join Counter c
          on t.CounterID = c.CounterID
        inner join Location l
          on c.PlaceID = l.PlaceID
    )
    select *, sum( CounterDataDiff ) over () as CounterDataSum  
    from
    (
    select t1.PlaceName, t1.CounterNote, ( t1.CounterData - t2.CounterData ) CounterDataDiff
      from cte t1 
        inner join cte t2
          on t1.CounterID = t2.CounterID
          and t1.id = 1 
          and t2.id = 2
    ) MyTable


    http://www.t-sql.ru

    4 июня 2012 г. 12:05
    Модератор
  • CounterData - показания счётчиков, вносятся в таблицу Testimony вместе со временем их снятия. Нужно определить, сколько прибор насчитал за определённый промежуток времени, например, за прошлый месяц. 2 момента времени - границы этого промежутка.

    4 июня 2012 г. 18:37
  • select L.PlaceName, C.CounterNote, T.CounterData,

    LAG(T.CounterData,1,0) OVER (partition by T.CounterID order by T.TimeDate) as [Difference] from Testimony T INNER JOIN Counter C on T.CounterID = C.CounterID inner join Location L on C.PlaceID = L.PlaceID where T.TimeDate between @StartDate and @EndDate


    See http://msdn.microsoft.com/en-us/library/hh231256.aspx for LAG function.


    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog


    • Изменено Naomi N 4 июня 2012 г. 18:54
    • Предложено в качестве ответа Abolmasov Dmitry 5 июня 2012 г. 12:04
    4 июня 2012 г. 18:53
  • J.Lion, посмотрите ответ предложенный Naomi, если он решает проблему, не забудьте его отметить. Спасибо.

    Для связи [mail]

    5 июня 2012 г. 12:05
  • Ответ частично решает проблему. Я не разобрался с функцией LAG, знания английского не хватает.

    В результате получается таблица, последний столбец которой я не понимаю. В предпоследнем же столбце должна отображатся разность между показаниями счётчика (CounterData) во время @StartDate и @EndDate (столбец TimeDate таблицы Testimony).

    Сейчас выдаются по две строки для каждого счётчика с показаниями в моменты @StartDate и @EndDate

    5 июня 2012 г. 12:15
  • If all you need is to see the difference between CounterData at @StartDate and @EndDate, then

    ;with cteStart as (select CounterID, CounterData from Testimony where TimeDate = @StartDate), 
    
    cteEnd as (select CounterID, CounterData from Testimonty where TimeDate = @EndDate)
    
    SELECT L.PlaceName, C.CounterNote, 
    E.CounterData - S.CounterData as [Difference]
    from cteStart S inner join cteEnd E ON S.CounterID = E.CounterID
    
     T INNER JOIN Counter C on S.CounterID = C.CounterID inner join Location L on C.PlaceID = L.PlaceID
    I assume that you will always have data for the two passed times, if not, we may want to use FULL JOIN between cteStart and cteEnd and then join the result to the rest of the tables.


    For every expert, there is an equal and opposite expert. - Becker's Law


    My blog


    • Изменено Naomi N 5 июня 2012 г. 12:49
    • Помечено в качестве ответа J.Lion 5 июня 2012 г. 15:40
    5 июня 2012 г. 12:49
  • It's just perfect! Thanks a lot, Naomi

    5 июня 2012 г. 15:39