【问题标题】:SQL SUM and nested where clauseSQL SUM 和嵌套 where 子句
【发布时间】:2013-04-22 09:12:36
【问题描述】:

我有一个以 id、开始日期和结束日期作为参数的 SQL。然后我总结了某些受 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(Mileage) As MileageTotal 忽略 where 子句

【问题讨论】:

    标签: sql sql-server select sum where


    【解决方案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
    

    &lt; table &gt; 替换为您的实际表名(Journey???)

    【讨论】:

    • 我认为这可能是答案,但它返回了两个记录集。我需要报告的单一记录集回报。我绑定了下面的解决方案,但这会再次返回多个记录集并且
    • 我已更新查询以显示全文 - 任何建议干杯
    【解决方案2】:

    去掉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 子句中添加更多条件——我不确定您想要哪个总数。

    【讨论】:

    • 我最终可能需要这样做,因为我只能返回一个记录集,否则报表控件会生成一个新页面
    • 我已更新查询以显示全文 - 任何建议干杯
    • 干杯戈登 - 就是这个!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 2020-11-29
    相关资源
    最近更新 更多