【问题标题】:Query is summing values multiple times查询多次对值求和
【发布时间】:2020-05-13 05:02:18
【问题描述】:

您好,我下面的查询是根据我表中的@cropseasons 对多个值求和。由于我有 4 个作物季节,它似乎将值乘以 4,因为我的作物季节为 1、2、3 或 4。我想要的只是 1 个作物季节的值。有人可以帮忙吗?我在两张表中都有作物季节。

With Summary as (
    Select B_NAME as Branch, LOC as Location
          ,SUM(payment) as Gallons
          ,SUM(case when printed = 1 THEN Fee ELSE NULL END) as FeeCollected
          ,SUM(case when printed = 0 THEN Fee ELSE NULL END) as FeeNotCollected
          ,SUM(case when printed = 1 THEN Payment ELSE NULL END) as GallonsIssued
          ,SUM(case when printed = 0 THEN Payment ELSE NULL END) as GallonsNotIssued
    From SicbWeeklyDeliveriesFuelArchive F Inner Join FarmerGroups G ON G.BSI_CODE = F.BSI_CODE

    Where F.CROP_SEASON = @cropseason

    Group By B_NAME, LOC
    )

SELECT Branch
      ,Location
      ,Gallons
      ,GallonsIssued
      ,GallonsNotIssued
      ,FeeCollected
      ,FeeNotCollected
      ,((GallonsIssued/Gallons) * 100) as pct_GallonsCollected
    FROM Summary
    Order by Location, Branch

SicbWeeklyDeliveriesFuelArchive

+-------+----------+-------------+------+----------+ ------+-------------+----------+ |身份证 | BSI_CODE | B_NAME |地点 |付款 |费用 |作物季节 |印刷 | +-------+----------+-------------+------+----------+ ------+-------------+----------+ | 18735 |第2176章圣纳西索 |捷克 | 85 | 8.5 | 4 | 0 | | 18738 |第2176章圣纳西索 |捷克 | 65 | 6.5 | 4 | 0 | | 18739 | 10494 |圣纳西索 |捷克 | 85 | 8.5 | 3 | 0 | +-------+----------+-------------+------+----------+ ------+-------------+----------+

农民组

+-------+----------+--------------+--------------+ |身份证 | BSI_CODE |作物季节 |分行 | +-------+----------+--------------+--------------+ | 10473 |第2176章4 |圣纳西索 | | 11478 |第2176章3 |圣纳西索 | | 12787 | 10494 | 4 |圣罗马 | +-------+----------+--------------+--------------+

【问题讨论】:

  • 我们不知道你的桌子。您的查询中有两个表,但您没有限定列。你有b_name,但它是f.b_name 还是g.b_name?是f.locg.loc? f.printed`还是g.printed? ...您已将每周行限制为一个作物季节,但您似乎为一个这样的行获得了多个农民组。您加入 BSI 代码,这在农民组表中可能不是唯一的。因此,您会获得多个匹配项。在不了解您的桌子的情况下,我们无法提供帮助。如果农民组表也有作物季节列,那么您在 ON 子句中忘记了它。
  • 有时它有助于在不进行聚合的情况下运行查询,即只需 select * from sicbweeklydeliveriesfuelarchive f inner join farmergroups g on g.bsi_code = f.bsi_code where f.crop_season = @cropseason order by b_name, loc 即可查看您构建总和的数据集。
  • @ivias 。 . .没有人能真正回答你的问题。正如 Thorsten 指出的那样,这是不可思议的。 限定所有列引用,以便清楚它们来自哪些表。提供样本数据和所需结果,以便我们了解您要解释的内容。您还应该提供适当的数据库标签。
  • @ThorstenKettner 我已经添加了表格和示例数据。我还尝试在 FROM 语句的同一行添加 F.CROP_SEASON = cropseason,例如。来自 SicbWeeklyDeliveriesFuelArchive F Inner Join FarmerGroups G ON G.BSI_CODE = F.BSI_CODE AND F.CROP_SEASON = cropseason 但似乎仍然不起作用。

标签: sql summary


【解决方案1】:

您的加入条件似乎不完整。这些表共享BSI_CODECROP_SEASON,所以我猜你想要:

FROM sicbweeklydeliveriesfuelarchive f 
JOIN farmergroups g ON g.bsi_code = f.bsi_code AND g.crop_season = f.crop_season
WHERE f.crop_season = @cropseason

但这只是猜测。只有您知道这些表是如何真正相关的,它们的行代表什么,哪些列使一行独一无二,以及您实际追求的结果是什么。你为什么要加入farmergroups?看起来您并没有真正在查询中使用该表。

【讨论】:

  • 谢谢。我似乎错过了 AND 部分。
猜你喜欢
  • 1970-01-01
  • 2020-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
相关资源
最近更新 更多