【问题标题】:Sum not returning accurate values总和没有返回准确的值
【发布时间】:2014-01-21 18:36:03
【问题描述】:

我正在尝试编写一个查询来了解我在固定时间段内拥有多少客户。期间已在数据库中设置,我只是对该期间的客户进行总和。

使用:

select distinct numguests, checknum
from guest_check_hist
where revenuecenterid in ('146708') and openfixedperiod = '89'
    and openbusinessdate between dateAdd(day, -2,getDate()) and dateAdd(day, -1,getDate())`

我发现我有 7 个订单,总共 10 个客户。

然后我运行:

Select Distinct MENU_ITEM_FIXED_PERIOD_TOTAL.businessDate as 'Effective Date',
    sum(H.guests) as guests, menu_item_fixed_period_total.fixedperiod,
    menu_item_fixed_period_total.revenuecenterid
FROM MENU_ITEM_FIXED_PERIOD_TOTAL
inner JOIN (
    select distinct checknum, numguests as guests, openbusinessdate, revenuecenterid, openfixedperiod 
    from guest_check_hist
    where openbusinessdate between dateAdd(day, -2,getDate()) and dateAdd(day, -1,getDate())
) H ON Menu_item_fixed_period_total.businessdate = H.openbusinessdate and menu_item_fixed_period_total.revenuecenterid = H.revenuecenterid and H.openfixedperiod = menu_item_fixed_period_total.fixedperiod
where menu_item_fixed_period_total.revenuecenterid in ('146708')
    and menu_item_fixed_period_total.businessdate between dateAdd(day, -2,getDate()) and
    dateAdd(day, -1,getDate()) and fixedperiod = '89'
group by fixedperiod, businessdate, menu_item_fixed_period_total.revenuecenterid
order by fixedperiod`

发现我有 200 位客人。

显然这是不对的。

Numguests 的数据类型为 Int。你能指出我的错误在哪里吗?

实际数据:

个别订单:

  • numguets 校验码
  • 0, 2917
  • 1, 2918
  • 1, 2921
  • 1, 2922
  • 2, 2919
  • 2, 2923
  • 3, 2920

汇总结果:

  • [生效日期]客人固定期间收入中心ID
  • 2014-1-20, 200, 89, 146708

预期结果:

  • [生效日期]客人固定期间收入中心ID
  • 2014-1-20, 10, 89, 146708

【问题讨论】:

  • 为什么有 distinct 和 group by?你能展示一些样本数据和期望的结果吗?由于您过度使用 distinct,我几乎预计会比您更多的行。
  • Distinct 只是从我的故障排除中继承而来,以识别特定订单,因为没有它,它们会多次出现。由于求和而使用分组依据。
  • 哦,请不要在评论中发布一堆数据。将示例数据添加到问题中或在SQL Fiddle 中正确准备。
  • 问题底部有数据。
  • 是否只有与过滤器匹配的数据(例如,落在 where 子句中的 openbusinessdate 范围内)?您预期的总和结果是什么?

标签: join sum sql-server-2012


【解决方案1】:

您是否尝试将过滤器放在括号中以避免混淆。

我认为“and fixedperiod = '89'”会造成更多记录。把这句话放在上面。

【讨论】:

  • 固定周期减少记录数。该系统每天有 96 个固定周期,以 15 分钟为增量。为了减少我不得不解释的数据量,我选择了一个足够小可以使用的特定时期。许多其他人在 70 多个订单上拥有 50 位客人。
【解决方案2】:

我认为您的查询比实际需要的要复杂得多。试试这个开始:

DECLARE @date DATE = '2014-01-20';

SELECT 
  [Effective Date] = m.businessdate, 
  guests = SUM(h.numguests), 
  h.fixedperiod, 
  h.revenuecenterid
FROM 
  dbo.MENU_ITEM_FIXED_PERIOD_TOTAL AS m
INNER JOIN dbo.guest_check_hist AS h
  ON h.openbusinessdate >= m.businessdate
  AND h.openbusinessdate < DATEADD(DAY, 1, m.businessdate)
  AND h.fixedperiod = m.fixedperiod
  AND h.revenuecenterid = m.revenuecenterid
WHERE m.businessdate = @date
GROUP BY m.businessdate, h.fixedperiod, h.revenuecenterid
ORDER BY h.fixedperiod;

SQL Fiddle demo

【讨论】:

  • 它更干净,但我得到完全相同的结果。
  • @user3220005 然后你需要展示更好的数据。 Adjust the fiddle I created 以便那里的表具有演示问题的数据。当您的数据明显不同于您在问题中发布的数据时,我无法修复与您使用我能看到的唯一数据获得的查询结果不同的查询结果。
【解决方案3】:

我通过确定我需要的所有数据都在 guest_check_hist 中来解决这个问题,并且总和以某种方式使总数翻了一番。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    • 2016-02-03
    • 2019-12-13
    • 2014-11-26
    • 1970-01-01
    相关资源
    最近更新 更多