2015-12-21 181 views
4

我有表IPAddressHistory包含三列IPAddressIDDateFromDateTo,和另一个表IPAddressTimeValue与特定时间的详细值。所以,我需要选择和值从IPAddressTimeValue通过IPAddressID从IPAddressHistory DateFrom和DateTo之间有关。你可以从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

我需要从IPAddressHistory中选择加入两列CCNI和TRNI,它们是IPAddressTimeValue中的SUM值,其中DateFrom和DateTo之间的时间间隔是从IPAddressHistory中选择的。每行必须包含IPAddressID,SUM(CCNI),SUM(TRNI),DateFrom和DateTo。您可以在我提供的sqlfiddle页面上的“运行SQL”之后看到结果输出。 – 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),只需使用一些日期格式函数。不要忘记在group by上的select字段中使用它。

+0

非常感谢,它正在按我的需要工作。 – Sanprof

+0

很高兴我可以帮助:) –

1

我不知道我是否正确理解,但你需要这样的东西?通过IPAddressID连接表并使用DateFrom,DateToHistory表中获得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 uopdated我的答案,检查它。 –

+0

你的结果是错误的,因为'between'包含两端的INCLUSIVE。所以你正在考虑不应该考虑的价值。 –