2015-12-21 3 views
4

У меня есть таблица IPAddressHistory, который содержит три колонки IPAddressID, DateFrom и DateTo, а другой таблицы IPAddressTimeValue с подробными значениями по конкретному времени , Таким образом, мне нужно выбрать значения SUM из IPAddressTimeValue связаны IPAddressID между DateFrom и DateTo из IPAddressHistory. Вы можете видеть, что я хочу от sqlfiddle, там я использовал, например, простые статические даты от IPAddressHistory и UNION ALL. Благодарю.Присоединение строки из одной таблицы со значением суммы из другой таблицы

Исходные таблицы:

CREATE TABLE IPAddressHistory(
    [IPAddressHistoryID] int IDENTITY(1,1) NOT NULL, 
    [IPAddressID] int NOT NULL, 
    [DateFrom] datetime, 
    [DateTo] datetime, 
CONSTRAINT [PK_IPAddressHistory] PRIMARY KEY CLUSTERED 
(
    [IPAddressHistoryID] ASC 
) 
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY]; 

CREATE TABLE IPAddressTimeValue(
    [IPAddressTimeValueID] int IDENTITY(1,1) NOT NULL, 
    [IPAddressID] int NOT NULL, 
    [Time] datetime, 
    [CCNI] int, 
    [TRNI] int, 
CONSTRAINT [PK_IPAddressTimeValue] PRIMARY KEY CLUSTERED 
(
    [IPAddressTimeValueID] ASC 
) 
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY]; 

Исходные данные:

enter image description here enter image description here

выход Результат: enter image description here

+1

Укажите желаемый результат. –

+0

Мне нужно объединить два столбца CCNI и TRNI от выбора из IPAddressHistory, которые являются значениями SUM из IPAddressTimeValue, где время между DateFrom и DateTo из IPAddressHistory выбирает. Каждая строка должна содержать IPAddressID, SUM (CCNI), SUM (TRNI), DateFrom и DateTo. Результат вы можете увидеть после «Запустить SQL» на странице sqlfiddle, которую я предоставил. – Sanprof

+0

Данные, предоставленные вами на скрипке, не соответствуют введенным значениям. Взгляните на даты от «20151220 до 20151221» для ipaddressuid у вас есть 70 и 35 в виде суммы, а не 40 и 20, как показано в примере с данными. Пожалуйста, дайте мне знать, если я ошибаюсь, или вы! –

ответ

2

запроса, вам нужно это один:

select a.[IPAddressID], 
     a.[DateFrom], 
     a.[DateTo], 
     SUM([CCNI]) [CCNI], 
     SUM([TRNI]) [TRNI] 
    from IPAddressHistory a 
     INNER JOIN IPAddressTimeValue b 
       ON (a.[IPAddressID] = b.[IPAddressID]) 
where b.[Time] > a.[DateFrom] 
    and b.[Time] <= a.[DateTo] 
group by a.[IPAddressID], a.[DateFrom], a.[DateTo]; 

Смотреть это работает здесь с вами собственный выбор союзы: http://sqlfiddle.com/#!6/abfe6/5

Чтобы отформатировать даты (datefrom и dateto), как вы хотите, используйте только функцию формата даты. Не забудьте использовать его в поле выбора также в группе.

+0

Большое вам спасибо, он работает, как мне нужно. – Sanprof

+0

Рад, что я мог бы помочь :) –

1

Я не знаю, правильно ли я понял, но вам нужно что-то вроде этого? Соедините таблицы через IPAddressID и используйте DateFrom, DateTo от History стол в WHERE статья?

ОБНОВЛЕНО

select h.IPAddressID, sum(CCNI) as CCNI, sum(TRNI) as TRNI, DateFrom, DateTo 
from IPAddressHistory h 
left join IPAddressTimeValue v on h.IPAddressID = v.IPAddressID 
where v.[time] > h.DateFrom and v.[time] <= h.DateTo 
group by h.IPAddressID, DateFrom, DateTo 

Вы можете проверить его на: SQL FIDDLE

+0

К сожалению, DateFrom и DateTo должны быть взяты из IPAddressHistory. – Sanprof

+0

@Sanprof подтвердил мой ответ, проверьте его. –

+0

Ваш результат неверен, так как 'between' является INCLUSIVE для обоих концов. Поэтому вы рассматриваете ценности, которые не следует учитывать. –

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