如何按日期计算来自2个不同表的数据

时间:2012-04-29 16:35:34

标签: sql sql-server-2005

我有2个没有关系的表,两个表都有不同的列数,但是有几列相同但保存不同的数据。我能够创建一个只有我想要的数据的函数或视图,但是当我尝试通过过滤日期来计算数据时,我总是得到错误的计数作为回报。让我通过展示2个函数和我尝试做的事来解释:

功能1

ID - number from 1 to 8
data sent - YES or NO 
Date - date value

功能2

ID - number from 1 to 8
data sent - yes or no
date - date value

单独运行时,我从表中获取所有行,一切看起来都不错。

然后我尝试将以下内容添加到每个函数中:

select 
     count([data sent]), ID 
from function1 
Where (date between @date1 and @date2) 
group by ID

上述说法效果很好,并为每个功能提供了正确的结果。

现在我想如果我想将这两个函数添加到一个中并从1页上的两个函数中获取计数。

所以我创建了以下函数:

功能3

select 
    count(Function1.[data sent]) as Expr1, 
    Function1.id, 
    count(Function2.[data sent]) as Expr2, 
    Function1.date
from 
    Function1 
LEFT OUTER JOIN 
    Function2 on Function1.id = Function2.id
Where 
    (Function1.date between @date1 and @date2)
group by 
    Function1.id

运行上述内容后,我得到下表:

ID  Expr1  Expr2

在Expr1和Expr2上,我得到的结果我不知道它们来自哪里。我想有些东西乘以100000,因为一个表格中包含近15000行,另一个表格大约有5000行。

我首先要知道的是,是否有可能按日期过滤并同时计算两个表中的记录。如果有人需要更多信息,请告诉我,我将很乐意分享和解释更多信息。

谢谢

3 个答案:

答案 0 :(得分:0)

LEFT OUTER JOIN占据左表的每一行,找到右表中具有相同id字段的所有行,并在结果表中创建那么多行。由于id不是我们通常认为的身份字段(它看起来更像是“deviceId”或其他东西),因此每个都会得到很多匹配。重复15000次,你就会发生组合爆炸。

提示:要调试这样的事情,您可以创建包含真实数据的一小部分的样本表,比如每行10行,然后对它们运行查询。你马上就会看到这个问题。

可以按日期过滤。如果没有更好地理解你的短语“我想将这两个函数合并为一个并从1页的两个函数中获取计数”,很难推荐一个实际的解决方案。

答案 1 :(得分:0)

为什么不能为每个函数创建一个临时表,然后将它们连接在一起?

答案 2 :(得分:0)

也许子查询可以帮助您实现您想要的目标:

SELECT
  ID   = COALESCE(f1.ID,   f2.ID),
  Date = COALESCE(f1.Date, f2.Date),
  f1.Expr1,
  f2.Expr2
FROM (
  SELECT
    ID,
    Date,
    Expr1 = COUNT([data sent])
  FROM Function1
  WHERE Date BETWEEN @date1 AND @date2
  GROUP BY
    ID,
    Date
) f1
FULL JOIN (
  SELECT
    ID,
    Date,
    Expr2 = COUNT([data sent])
  FROM Function2
  WHERE Date BETWEEN @date1 AND @date2
  GROUP BY
    ID,
    Date
) f2
ON f1.ID = f2.ID AND f1.Date = f2.Date

此查询还使用完整(外部)连接而不是左连接,以防连接的右侧包含左侧没有匹配的行(并且您希望这些行)。