【发布时间】:2012-08-31 16:52:44
【问题描述】:
前几天在这方面得到了一些帮助,现在真的想做出更好的改变
这里是代码
select
machines.serialnum, DRPS.assetnumber, DRPS.MOCALCSUM, DRPS.MICALCSUM,
DRPS.COCALCSUM, DRPS.CICALCSUM, ISSUED.TotalIssued,
REDEEMED.TotalRedeemed,drps.dropdate1,drps.dropdate2
from
(select serialnum
from machineinfo) as machines
LEFT JOIN
(select
assetnumber, min(dropdate) as [dropdate1], max(dropdate) as [dropdate2],
sum(mocalc) AS [MOCALCSUM], sum(micalc) AS [MICALCSUM],
sum(cocalc) AS [COCALCSUM],sum(cicalc) AS [CICALCSUM]
from drops
where dropdate > '09/04/2012' and dropdate < dateadd(hour, -0, getdate())
GROUP BY assetnumber) AS DRPS on machines.serialnum = drps.assetnumber
LEFT JOIN
(select
snissued, cast(sum(amount) as money) / 100 AS [TotalIssued]
from tickets
where dateissued > '09/04/2012' and dateissued < dateadd(hour, 0, getdate())
group by snissued) AS ISSUED ON machines.serialnum = ISSUED.snissued
LEFT JOIN
(select
snredeemed, cast(sum(amount) as money) / 100 AS [TotalRedeemed]
from tickets
where dateredeemed > '09/04/2012' and dateredeemed < dateadd(hour, 0, getdate())
group by snredeemed) AS REDEEMED ON machines.serialnum = REDEEMED.snredeemed
如果可能的话,我想完成的第二个和第三个连接是在这样的 where 子句中使用drps.drop1
where dropdate > drps.dropdate1 and dropdate < drps.dropdate2
但它不起作用
这是工作输出
序列号 MOCALCSUM MICALCSUM COCALCSUM CICALCSUM TotalIssued TotalRedeemed dropdate1 dropdate2 0-2739-41401 5482 5498 132 148 3258.00 3110.00 2012-09-04 13:36:53.450 2012-09-05 13:55:38.750 0-2459-36182 1110 1054 114 58 1895.00 1657.00 2012-09-04 15:01:19.973 2012-09-05 13:55:38.967最终结果是我需要总发行日期和总赎回日期范围在每个序列号的最小和最大日期之间
【问题讨论】:
-
只是在第一个左连接上添加一个,如果结果为空,那么它可能会找到最近的日期,因为在 9/4 和现在之间没有日期,所以使用 9/ 12/2012,因为这是最后一次
-
在处理外连接时,应将所有与外表有关的过滤器放在连接本身(ON 子句),否则空行将与过滤器不匹配(
is null除外)并从结果集中删除.您可能想要添加比but it does not work更有意义的问题描述。事情并没有以许多不同的方式发挥作用。 -
如果我将 where dateissued > '09/04/2012' 和 dateissued drps.dropdate1 和 dateissued
-
这是因为您不能在派生表中使用外部表。您在
from或join部分中用括号括起来的任何内容都无法访问 from 或 join 中的任何其他内容。唯一的通信方式是通过 ON 子句。由于您在派生表中聚合数据,因此无法在 ON 子句中使用过滤器,因为为时已晚。我认为您可能会嵌套最后两个连接,以便您首先过滤未聚合的数据并将其聚合到外部连接中,对最后一个左连接重复此操作以避免重复。不幸的是,写了很多。 -
或者,从最后两个左连接中的 drop 中重新选择 min 和 max,并通过内连接将它们用作过滤器。或者简单地在选择列表中使用子查询 - 每行执行子查询,因此可以考虑外部表达式。
标签: sql-server-2008 select join where