我有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行。
我首先要知道的是,是否有可能按日期过滤并同时计算两个表中的记录。如果有人需要更多信息,请告诉我,我将很乐意分享和解释更多信息。
谢谢
答案 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
此查询还使用完整(外部)连接而不是左连接,以防连接的右侧包含左侧没有匹配的行(并且您希望这些行)。