2012-09-06 87 views
1

條款得到了一些幫助,有一天就這個問題和現在真的想做出改變爲更好SQL Server 2008的左加入其中,基於最大日

這裏是代碼

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 

我會想實現如果可能是第二個和第三個連接是使用drps.drop1在where子句中像這樣

where dropdate > drps.dropdate1 and dropdate < drps.dropdate2 

,但它不工作

這裏正在輸出

 
    serialnum 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 

最終的結果是我需要的全部已發行和總贖回日期範圍爲每基於從意見建議序號

+0

只是在第一個左連接添加有可能,如果結果爲null,那麼它可以找到最近的日期之前,因爲沒有d在9/4之間吃東西,現在可以使用9/12/2012,因爲它是最後一個 –

+0

在處理外部連接時,應該將所有有關外部表的過濾器連接在一起(ON子句),否則空行將不匹配過濾器除了'null'之外)並從結果集中移除。你可能想要添加更多有意義的問題描述,而不是'但它不起作用。事情不會以許多不同的方式工作。 –

+0

如果我更改where dateissued> '09/04/2012'和dateissued drps.dropdate1和dateissued

回答

2
declare @datebegin datetime 
declare @dateend datetime 
set @datebegin = '09/04/2012' 
set @dateend = '09/08/2012' 

select machines.serialnum,  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 > @datebegin and dropdate < @dateend AND (ignore is null) 
      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 > (select min(dropdate) 
         from drops 
         where dropdate > @datebegin AND (ignore is null) and snissued = assetnumber)) 
         and 
     (dateissued < (select max(dropdate) 
         from drops 
         where dropdate < @dateend AND (ignore is null) and snissued = assetnumber)) 
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 > (select min(dropdate) 
         from drops 
         where dropdate > @datebegin AND (ignore is null)and snissued = assetnumber)) 
         and 
     (dateredeemed < (select max(dropdate) 
         from drops 
         where dropdate < @dateend AND (ignore is null)and snissued = assetnumber)) 

group by snredeemed) AS REDEEMED 
ON machines.serialnum=REDEEMED.snredeemed 
order by REDEEMED.TotalRedeemed desc 

最小和最大日期之間我添加子查詢到選擇,我得到預期的結果現在