【问题标题】:SQL Selecting statement, sum function in whereSQL选择语句,求和函数在where
【发布时间】:2014-03-25 09:26:08
【问题描述】:

我有一张桌子,上面有很多账单。我需要从账单中选择超出价格的项目。

我试过这个:

SELECT   d.BillNumber
       , SUM(d1.Amount* d1.Price) 
       , d2.Name AS FinalPrice
FROM GEMsc106Antet d LEFT OUTER JOIN GEMsc106Pozitii d1 
ON d1.Luna = d.Luna AND d1.NumarI = d.NumarI 
JOIN GEcProduse d2 ON d2.Cod = d1.CodMaterial 
WHERE YEAR(d.Data) = 2013 
GROUP BY   d.BillNumber , d2.Name 
HAVING SUM(d1.Amount* d1.Price) >= 10000

但是这个语句似乎没有起作用,因为首先它只选择了我 2013 年的账单,这没问题,但是我应该得到所有大于 10.000 的账单,我不能使用总和where 子句,只有在那之后我才应该对它们进行 GROUP。

我能做什么?

【问题讨论】:

  • 查询似乎很好...您有 3 个连接...因此,如果至少有一个连接未被验证,则查询将跳过很多结果...尝试通过删除一些连接来进行测试以确保何时出现问题
  • BillNumber 是否唯一?如果是这样,您将不需要分组,只需在 where 子句中检查金额 * 价格

标签: sql sql-server tsql sum where


【解决方案1】:

您可能不想将所有逻辑塞进一个select。试试with构造:

with data as ( 
       -- Your preliminary data: cheques (?) with bill sum and the actual price
   select d.BillNumber as BillNumber, 
          sum(d1.Amount * d1.Price) as Bill,
          d2.Name as Price
     from GEMsc106Antet d 
            left join
              GEMsc106Pozitii d1 on d1.Luna = d.Luna and d1.NumarI = d.NumarI
            join
              GEcProduse d2 on d2.Cod = d1.CodMaterial 
    where Year(d.Data) = 2013
 group by d.BillNumber, 
          d2.Name)

-- Final query: just use appropriate where condition
select *
  from data
 where Bill > Price

【讨论】:

    【解决方案2】:

    这只有在 BillNumber 和 d2.Name 是唯一的情况下才有效:

    SELECT   d.BillNumber
           , d1.Amount* d1.Price 
           , d2.Name AS FinalPrice
    FROM GEMsc106Antet d 
    LEFT OUTER JOIN GEMsc106Pozitii d1 
       ON d1.Luna = d.Luna AND d1.NumarI = d.NumarI 
    JOIN GEcProduse d2 
       ON d2.Cod = d1.CodMaterial 
    WHERE YEAR(d.Data) = 2013 AND (d1.Amount* d1.Price) >= 10000
    

    【讨论】:

      【解决方案3】:

      我设法解决了查询看起来像这样的问题

      Select x.Name
      from GECProduse x
      join GEMSc106Pozitii p on x.Cod= p.CodMaterial
      join (Select d.Month, d.NumarI from GeMsc106Antet d 
          join GEMsc106Pozitii d1 on d.Month= d1.Month and d.NumarI=d1.NumarI
          WHERE YEAR(d.Data) = 2013
          GROUP by d.Numar,d.Month, d.NumarI HAVING sum(d1.Quantity*d1.SellingPrice) >= 10000) p1 on p1.Month=p.Month and p1.NumarI=p.NumarI
      GROUP BY x.Name
      

      【讨论】:

        猜你喜欢
        • 2015-07-25
        • 1970-01-01
        • 2011-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-16
        • 2023-02-07
        相关资源
        最近更新 更多