【问题标题】:SQL SERVER Case Statement for Order By Clause按子句排序的 SQL SERVER 案例语句
【发布时间】:2020-03-20 23:46:58
【问题描述】:

继我之前的问题之后,我是否可以带回最高价格并汇总来自多个供应商的所有数量 [选择最高价格并为所有供应商添加数量] (SQL Server : SELECT Highest Price and add qty's from table)

我想将 case 语句放入查询的 ORDER BY Price DESC 部分,如果数量 > 10 则返回最高价格,如果不满足 case 则返回最低价格,但我似乎无法获得查询工作。是否可以将案例放在同一个查询中?还是有其他方法可以解决这个问题?

这很好用,因为它是

SELECT ManuPartNo, WebPrice, TotalQtyAdded, Supplier
FROM
(SELECT dbo.TableAllProds. *,
    ROW_NUMBER() OVER(PARTITION BY ManuPartNo ORDER BY WebPrice DESC) AS RN,
    SUM(TotalQty) OVER(PARTITION BY ManuPartNo) AS TotalQtyAdded
        FROM TableAllProds) AS t
WHERE RN = 1
ORDER BY ManuPartNo

这是我一直在尝试的,但是我似乎写了 If 部分,它似乎不喜欢语法。

SELECT ProdName, ManuPartNo, Price, Qty, TotalQty, Supplier
FROM (  SELECT *,
           ROW_NUMBER() OVER(PARTITION BY ManuPartNo 
               ORDER BY 
                      CASE WHEN Price > '10' Price DESC
                      ELSE Price ASC END ) AS RN,
           SUM(Qty) OVER(PARTITION BY ManuPartNo) AS TotalQty,
    FROM dbo.TableAllProds) AS t
WHERE RN = 1
ORDER BY ManuPartNo;

是否可以在一个查询中编写此内容?任何建议或对其他帖子的指点将不胜感激。

【问题讨论】:

  • 不能混合排序。 DESCASC 不能是表达式的一部分。
  • (1) 没有case 语句,但是有case 表达式。 (B) 你可能指的是when Qty > 10,而不是when Price > 10。 (iii) 虽然case 表达式不能返回排序顺序,但您可以做一些奇怪的事情,例如order by case when Qty > 10 then -Price else Price end。这将根据Qty 翻转顺序。 (d) 停止混合数字和字符串。 10 是一个数字,'10' 是一个字符串。如果您想将 PriceQty 与数字进行比较,请使用数字。
  • HABO 谢谢,我在案例中混淆了价格和数量,也将字符串更改为数字使声明工作,但它没有带回我想要的结果。现在已经很晚了。我将发布一些内容和预期结果并重新格式化我的问题。我可以使用 ssis 将最高和最低价格拆分为临时表,然后根据数量选择最高或最低,再次将所有数量添加到另一个临时表中,然后将数据带回单个表并更新总量,我只是不确定如何在一个选择查询中执行此操作。
  • 抱歉刚刚在价格前注明了-。应该返回较低的值吗?
  • @JohnSpencer 如果您按Price(升序)排序,您将首先获得最低价格。按Price 的负数排序,第一个值将成为最大负数。

标签: sql sql-server tsql


【解决方案1】:

您可以使用WITH TIES 子句。

但是,子查询 WHERE RN=1 的性能更高

示例

Select top 1 with ties *
 From  dbo.TableAllProds
 Order By row_number() over (partition by ManuPartNo Order by try_convert(money,Price) Desc)

【讨论】:

  • 嗨,约翰,感谢您的回答,我试过了,但是我不确定我会在哪里说明我的最小数量,即 >10,然后在满足条件时选择最高或最低。
猜你喜欢
  • 1970-01-01
  • 2012-05-25
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
  • 2019-03-11
  • 2011-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多