2013-04-28 111 views
0

我有一个SQL,它将一个ID,开始日期和结束日期作为参数。然后我总结一下受where子句的限制。不过,我也需要总结同一列,不考虑数据参数并计算特定驱动程序的总数。例如:SQL SUM和嵌套where子句

SELECT DISTINCT 
PMTS.VolunteerId, 
PMTS.ChargeRate, 
SUM(
CASE [Type] 
    WHEN 418 THEN Amount 
    ELSE 0 
END 
) AS DriverMileage, 
SUM(
CASE [Type] 
    WHEN 1000 THEN Amount 
    ELSE 0 
END 
) AS GPMileage, 
SUM(
CASE [Type] 
    WHEN 1001 THEN Amount 
    ELSE 0 
END 
) AS Reimbursements, 
SUM(
CASE [Type] 
    WHEN 1002 THEN Amount 
    ELSE 0 
END 
) AS MobilePhoneCharges, 
SUM(Mileage) AS TotalMileageWeek, 
B.TotalMileage, 
VOLS.Address1, 
VOLS.Address2, 
VOLS.Town, 
ISNULL(VOLS.Surname, '') + ', ' + ISNULL(VOLS.Forename, '') AS SurnameForename , 
ISNULL(VOLS.County, '') + ' ' + ISNULL(VOLS.PostCode, '') AS CountyPostcode 
FROM dbo.vVolunteerPayments PMTS 
INNER JOIN dbo.vVolunteers VOLS ON PMTS.VolunteerId = VOLS.VolunteerID 
--total mileage 
INNER JOIN (select VolunteerId, sum(Mileage) as TotalMileage 
     FROM dbo.vVolunteerPayments GROUP BY VolunteerId) b ON 
b.VolunteerID=PMTS.VolunteerId 
WHERE 
PMTS.VolunteerId = @volunteerid 
AND 
PMTS.PaymentEventID = 0 
AND 
PMTS.DateCreated BETWEEN @sd AND @ed 
GROUP BY 
PMTS.VolunteerId 
,Address1 
,Address2 
,Town 
,County 
,PostCode 
,Surname 
,Forename 
,B.TotalMileage 
,PMTS.ChargeRate 

所以SUM(里程)作为MileageTotal忽略where子句

回答

0

消除where条款并进行有条件求和:

Select Name, 
     SUM(case when Journey.DateCreated BETWEEN @startdate AND @enddate then Mileage 
       else 0 
      end) As MileageWeek, 
     SUM(Mileage) As MileageTotal 
from Journey 

我还在from条款中添加过(可能是您不小心遗漏了它)。

SUM(
CASE [Type] 
    WHEN 418 THEN Amount 
    ELSE 0 
END 
) AS DriverMileage, 

sum(case when [type] = 418 and PMTS.DateCreated BETWEEN @sd AND @ed then amount 
     else 0 
    end) as DriverMileage 

您可能需要包括来自where条款更多条件句 - 我不知道你想要的总数。

+0

我可能需要这样做,因为我只能有一个记录集返回,否则返回报表控件生成新页面 – amun1000 2013-04-28 20:47:47

+0

我已更新查询以显示全文 - 任何建议干杯 – amun1000 2013-04-28 21:18:08

+0

干杯戈登 - 多数民众赞成在! – amun1000 2013-04-28 22:21:20

1

试试这个:

Select 
    a.Name, 
    SUM(Mileage) As MileageWeek, 
    SUM(Mileage) As MileageTotal, 
    b.TotMiles 
    FROM <table> a 
    JOIN (select name,sum(Mileage) as TotMiles 
      FROM <table> GROUP By name) b ON b.name=a.name 
    WHERE 
    Journey.DateCreated BETWEEN @startdate AND @enddate 

替换<table>与您的实际表名(之旅 ??? )

+0

非常感谢你 – amun1000 2013-04-28 19:04:46

+0

我认为这可能是答案,但它返回两个记录集。我需要为报告提供单独的记录集报告。我将解决方案绑定在下面,但是这又返回了多个记录集并 – amun1000 2013-04-28 21:10:18

+0

我更新了查询以显示全文 - 任何建议Cheers – amun1000 2013-04-28 21:17:00