【问题标题】:SQL Server Query - Explanation BelowSQL Server 查询 - 说明如下
【发布时间】:2015-06-16 08:35:54
【问题描述】:

坚持如何实现以下目标,我们相信使用 IF/ELSE 或 CASE/WHEN 语句:

我们有一个项目,具有以下属性。

Item = ABC
Buy Quantity = 6
Tolerance Quantity = 4

我们正在尝试弄清楚如何计算收费数量,以下是它的工作原理

Ordered Quantity    Charged Quantity
1                   1
1.5                 1.5
3.83                3.83
4                   6
5.54                6
6                   6
7                   7
8.32                8.32
9                   9
10                  12
11.9                12
12                  12

购买数量为6,容差数量为4。也就是说,当订购数量在4-6范围内时,应该采取购买数量。

如果不在此范围内,则只取 Ordered Quantity。

当订购数量落入购买数量的每个“范围”(本例中为 6 的倍数)时,棘手的部分是这样做:

6(4-6)
12(10-12)
18(16-18)
24(22-24)
and so on...

每个项目可能有不同的购买/公差数量。

有兴趣了解您的解决方案/建议。

下面是带有值的创建表语句:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[StackQuestion](
    [OrderedQty] [numeric](19, 6) NULL
) ON [PRIMARY]

GO
INSERT [dbo].[StackQuestion] ([OrderedQty]) VALUES (CAST(1.000000 AS Numeric(19, 6)))
INSERT [dbo].[StackQuestion] ([OrderedQty]) VALUES (CAST(1.500000 AS Numeric(19, 6)))
INSERT [dbo].[StackQuestion] ([OrderedQty]) VALUES (CAST(3.830000 AS Numeric(19, 6)))
INSERT [dbo].[StackQuestion] ([OrderedQty]) VALUES (CAST(4.000000 AS Numeric(19, 6)))
INSERT [dbo].[StackQuestion] ([OrderedQty]) VALUES (CAST(5.540000 AS Numeric(19, 6)))
INSERT [dbo].[StackQuestion] ([OrderedQty]) VALUES (CAST(6.000000 AS Numeric(19, 6)))
INSERT [dbo].[StackQuestion] ([OrderedQty]) VALUES (CAST(7.000000 AS Numeric(19, 6)))
INSERT [dbo].[StackQuestion] ([OrderedQty]) VALUES (CAST(8.320000 AS Numeric(19, 6)))
INSERT [dbo].[StackQuestion] ([OrderedQty]) VALUES (CAST(9.000000 AS Numeric(19, 6)))
INSERT [dbo].[StackQuestion] ([OrderedQty]) VALUES (CAST(10.000000 AS Numeric(19, 6)))
INSERT [dbo].[StackQuestion] ([OrderedQty]) VALUES (CAST(11.900000 AS Numeric(19, 6)))
INSERT [dbo].[StackQuestion] ([OrderedQty]) VALUES (CAST(12.000000 AS Numeric(19, 6)))

根据建议进行工作查询:

declare @BuyQuantity as numeric(19,6)
declare @ToleranceQuantity as numeric(19,6)

set @BuyQuantity = 6
set @ToleranceQuantity = 4

SELECT *,
CASE
WHEN OrderedQty >= @ToleranceQuantity AND OrderedQty <= @BuyQuantity THEN @BuyQuantity 
ELSE OrderedQty 
END AS ChargedQuantity
FROM StackQuestion

正如您在工作查询中所见,第 10、11 和 12 行应返回 10、11.9 和 12。 我们如何使它们成为 12、12 和 12?

【问题讨论】:

  • 您的问题与您标记的 sql 有什么关系?我在这里只看到一些函数(数量)的计算,而没有关于 sql。
  • 对不起,无法理解“订购数量何时落入每个“范围”?
  • 安迪,我已经编辑了帖子,正在考虑使用 IF/ELSE 或 CASE/WHEN 来达到预期的结果。开发人员 D,我在“范围”语句中添加了附加注释。它与我上面包含的所需结果集有关。
  • 嗯,你能提供你的表的创建 stmts 吗?
  • 我会做并编辑帖子。

标签: sql sql-server math


【解决方案1】:

您可以这样计算 ChargedQuantity:

CASE
WHEN OrderedQuantity >= ToleranceQuantity AND OrderedQuantity <= BuyQuantity THEN BuyQuantity 
ELSE OrderedQuantity 
END AS ChargedQuantity

【讨论】:

  • 感谢 Panayotis,但我不相信当订购数量落入下一个“范围”时这会起作用。有时间我会尝试,但如果 Ordered Quantity 大于 6,则不会四舍五入到“范围”,例如:(如果 Ordered Quantity 为 11,它将显示 11 而不是 12)。
【解决方案2】:

绝对是要嵌入到 SQL 结果中的 CASE 语句,否则应用此逻辑很简单。

上面的答案是正确的,

SELECT *, 
    CASE 
        WHEN OQ >= TolQ AND OQ <= BQ THEN BQ 
        ELSE OQ 
    END ChargedQty
FROM table

【讨论】:

  • 谢谢克里斯,我已经添加了创建表/值和工作查询,以及我想要实现的目标。很想你解释为什么它是微不足道的。
  • 我不确定你想要达到什么目的。表定义和数据只有 1 列,所以我猜你想在 CASE 语句中使用 Row_Number 吗?我认为 IF 语句非常简单,尤其是对于这类问题。人们提供的 CASE 声明也很琐碎,但显然我们在某个地方漏掉了重点!
  • 谢谢 Chris,可能可以使用 Row_Number。我会思考这个问题。我会尝试看看我是否可以简化问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多