【问题标题】:Different results in SQL based on what columns I display根据我显示的列,SQL 中的不同结果
【发布时间】:2020-12-03 22:24:59
【问题描述】:

我正在尝试运行查询以收集我们数据库中手头的全部项目。但是,我似乎得到了不正确的数据。我选择仅选择金额字段并使用基于某些参数的单独表中的联接对其求和,但是如果我显示其他字段(例如订单号和日期),我会突然获得不同的数据,即使这些字段正在使用作为查询中的过滤器。是不是因为它不在select语句中?如果需要在select语句中可以不显示吗?

这是两个查询。

-- Items On Hand
select CONVERT(decimal(25, 2), SUM(tw.amount)) as 'Amt'
from [Sales Header] sh
join
(
select *
from TWAllOrders
where [Status] like 'Released'

) tw
on tw.[Order Nb] = sh.No_ 
join
(
select *
from OnHand
) oh
on  tw.No_ = oh.[Item No_]

where sh.[Requested Delivery Date] < getdate()

HAVING SUM(tw.Quantity) <= SUM(oh.Qty)

提供总和为 21667457.20

以及添加的列

-- Items On Hand
select CONVERT(decimal(25, 2), SUM(tw.amount)) as 'Amt', [Requested Delivery Date], sh.No_, tw.[Status]
from [Sales Header] sh
join
(
select *
from TWAllOrders
where [Status] like 'Released'

) tw
on tw.[Order Nb] = sh.No_ 
join
(
select *
from OnHand
) oh
on  tw.No_ = oh.[Item No_]

where sh.[Requested Delivery Date] < getdate()
group by sh.[Requested Delivery Date], sh.No_, tw.[Status]
HAVING SUM(tw.Quantity) <= SUM(oh.Qty)
order by sh.[Requested Delivery Date] ASC

提供 12319998 的总和

我是自学 SQL,所以我可能会误解一些明显的东西,感谢您的帮助。

【问题讨论】:

  • 您在后者中有一个GROUP BY,因此HAVING 中的过滤会有所不同。另外,我希望后一个查询中有多行

标签: sql sql-server


【解决方案1】:

在没有样本数据的情况下,我将不得不在原则上证明这一点。在后一个查询中,您有一个GROUP BY,这意味着HAVING 中的值的范围会有所不同,因此来自所述HAVING 的过滤会有所不同。

让我们获取以下示例数据:

CREATE TABLE dbo.MyTable (Grp char(1),
                          Quantity int,
                          Required int);

INSERT INTO dbo.MyTable (Grp, Quantity, [Required])
VALUES('a',2,7),
      ('a',14,2),
      ('b',4, 7),
      ('b',3,4),
      ('c',17,5);

现在我们将执行您的查询的过度简化版本:

SELECT SUM(Quantity)
FROM dbo.MyTable
HAVING SUM(Quantity) > SUM(Required);

这将返回值 40;这是Quantity 中所有值的SUM。因为Required 的总数SUM 是25,所以返回一个值。

现在让我们像第二个查询一样添加GROUP BY:

SELECT SUM(Quantity)
FROM dbo.MyTable
GROUP BY Grp
HAVING SUM(Quantity) > SUM(Required);

现在我们有 2 行,值 16 和 17 的总值是 33。这是因为 Grp 的值为 'B' 的行被过滤掉了,因为Quantity 的 SUM 比 'B' 的 Required低。

您的数据也是如此;在分组数据中,您有不满足 HAVING 条件的组,因此不会返回这些行。

【讨论】:

  • 非常感谢,这很有意义!我正在尝试在 ssrs 报告中使用它,如果值为 1 行,就像它在第一个查询中转储一样,它会更容易。是否可以使用 group by 但仍将所有内容汇总到一行?
  • 好像你不想要 HAVING, @bhatch22 。您可能需要提出一个新问题,详细说明您的实际目标,包括样本数据和预期结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多