当前位置: 首页 > 知识库问答 >
问题:

SQl-根据数量选择最佳价格

常乐
2023-03-14

我有一个表格,其中包含根据订购的数量和下订单的客户类型的特定项目的价格...

ID    Name     Quantity     ClientType    Price/Unit ($)
========================================================
1     Cheese      10        Consumer      20
2     Cheese      20        Consumer      15
3     Cheese      30        Consumer      12
4     Cheese      10        Restaurant    18
5     Cheese      20        Restaurant    13
6     Cheese      30        Restaurant    10

我在SQL中的WHERE子句中遇到问题,无法选择客户根据订购数量获得最佳价格的行。规则是,他们必须至少满足数量,才能获得该定价层的价格。如果他们的订单低于最低数量,那么他们将获得第一个数量的价格(本例中为10),如果他们的订单超过最大数量(本例中为30),则他们将获得该价格。

例如如果一家餐厅订购26单位奶酪,则应选择ID=5的那一行。如果消费者订购了9个单位的奶酪,则返回的行ID应为1。如果消费者订购50单位的奶酪,那么他们应该得到ID=3。

declare @SelectedQuantity INT;

SELECT * 
FROM PriceGuide
WHERE Name = 'Cheese'
  AND ClientType = 'Consumer'
  AND Quantity <= @SelectedQuantity

WHERE子句中缺少什么?

共有3个答案

唐运诚
2023-03-14

您的查询将返回小于@SelectedQuantity的所有匹配行。您只想返回最大数量小于所选数量的行,因此需要子查询来获得此结果:

SELECT * 
FROM PriceGuide a
WHERE a.Name = 'Cheese'
  AND a.ClientType = 'Consumer'
  AND a.Quantity = (SELECT MAX(Quantity) FROM PriceGuide
  WHERE ClientType = a.ClientType
  AND Name = a.Name
  AND Quantity <= @SelectedQuantity)
许兴文
2023-03-14

这有点棘手,因为您需要处理小于10的数量。

我认为最好的办法是:

SELECT TOP 1 *
FROM PriceGuide
WHERE Name = 'Cheese' AND ClientType = 'Consumer'
ORDER BY (CASE WHEN @SelectedQuantity >= Quantity THEN 1 ELSE 0 END) DESC, 
         (CASE WHEN @SelectedQuantity >= Quantity THEN PriceUnit END) ASC,
         Quantity ASC;

此版本通过保留给定Name/ClientType的所有行来处理最小数量,使用ORDER BY进行优先级排序。

汤飞羽
2023-03-14

编辑

如评论中所述,第一个解决方案没有正确处理特殊情况。

下一个尝试:

SELECT TOP 1 ID, Name, Quantity, ClientType, [Price/Unit]
FROM PriceGuide
WHERE Name = 'Cheese'
  AND ClientType = 'Consumer'
ORDER BY CASE WHEN Quantity <= @SelectedQuantity THEN Quantity ELSE -Quantity END DESC

假设Quantity为正,orderby将返回满足数量的行

对于与此条件不匹配的行,它使用-Quantity进行排序。因此,如果没有符合条件的行,将返回数量最小的行。

 类似资料:
  • 问题内容: 我在表中有三列:id,街道名称,计数。对于某些ID,不只是一个街道名称。Count告诉将每条街道分配给ID的频率。我怎样才能只获得编号最高的ID和街道名称。 表格示例: 结果应该是这样的: 提前致谢! 问题答案: 您没有指定正在使用的数据库,但是应该可以使用以下数据库: 请参阅带有演示的SQL Fiddle 。注意,您将必须使用MySQL的反引号或数据库使用的任何字符来转义保留字来转义

  • 我正试图根据一个标准将x个列的数据归零 例如: 第1页: 一月二月三月四月五月六月七月八月九月十月十一月十二月 第2页: 版本(标准)=2 因此,我想选择前两个月,并在1月份将所有数据归零 更新:到目前为止,我得到了这么多,现在我只能选择 我无法让它选择范围。

  • 我正在使用Adaptive Server Enterprise/15.7/EBF 25127 SMP sp 136/P/x86 _ 64/Enterprise Linux/ase 157 sp 136 x/3955/64位/FBO/周一2015年10月19日19:12:00 我有一个表,包括多个日期和价格的记录,我希望选择最近的日期和价格是最高的或最大的。 对于错误消息,max()函数似乎不起作用

  • 问题内容: 好的,因此我对其他解决方案没有任何帮助。所以这就是我想要做的。我需要选择多列的行,其中一列的值是最大值。 这是样本数据 我需要选择整行,其中orderfileid是每个唯一商品编号的最大值 返回的数据集应该看起来像 我想我尝试过可以想到的select max(orderfileid)的每种组合 任何帮助都将被申请。谢谢 问题答案: 您需要在子查询中找到MAX值,然后使用这些结果将其连接

  • 在WooCommerce最后一个版本中,我需要在产品页面上显示简短描述中选择的变化的重量,当您选择超过1个数量时,我想在添加到购物车按钮旁边显示总重量。 例如:我选择了4个数量。单位重量为4公斤。我需要显示:“总重量为16公斤”。 如果一般产品有重量,则此代码可以正常工作,但不适用于重量变化:

  • 问题内容: 假设我有一个处理100万个句子的任务。 对于每个句子,我都需要对其进行处理,而这与处理它们的顺序无关。 在我的Java程序中,我从我的主要工作分区中划分出一组期货,并带有一个可调用对象,该可调用对象定义了要在大量句子上完成的工作单元,并且我正在寻找一种优化线程数量的方法分配大量的句子来工作,然后重新组合每个线程的所有结果。 在我看到收益递减之前,我可以使用的最大线程数将使我在速度方面达