0

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

功能一

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

功能二

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

上面的语句效果很好,并为我提供了每个函数的正确结果。

现在我想如果我想将这 2 个函数加到一个中并从 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 行。

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

谢谢

4

3 回答 3

0

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

于 2012-04-29T18:30:28.120 回答
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

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

于 2012-04-29T23:22:19.837 回答
0

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

提示:要调试这样的事情,您可以使用一小部分真实数据创建示例表,例如每个表 10 行,然后对它们运行查询。你会立即看到问题。

可以按日期过滤。如果不更好地理解您的短语“我想将这 2 个功能添加到一个中并从 1 页上的两个功能中获取计数”,就很难推荐一个实际的解决方案。

于 2012-04-29T17:47:45.987 回答