Sql server SQL Server:当Else为case时,它在case子句中将0显示为默认值
此查询在AdventureWorks2014.Sales.SalesOrderDetail表上运行 我的疑问是:在CASE子句中,我已经清楚地说明了,当它是ELSE时。此查询删除重复的SalesOrderID,在第一次显示后,应将其替换为“-”此字符Sql server SQL Server:当Else为case时,它在case子句中将0显示为默认值,sql-server,Sql Server,此查询在AdventureWorks2014.Sales.SalesOrderDetail表上运行 我的疑问是:在CASE子句中,我已经清楚地说明了,当它是ELSE时。此查询删除重复的SalesOrderID,在第一次显示后,应将其替换为“-”此字符 SELECT CASE WHEN ROW_NUMBER() OVER(PARTITION BY SalesOrderID ORDER BY SalesOrderID ASC) = 1 THEN SalesOrderID ELSE '-'
SELECT
CASE WHEN ROW_NUMBER() OVER(PARTITION BY SalesOrderID ORDER BY SalesOrderID ASC) = 1 THEN SalesOrderID ELSE '-' END AS SalesOrderID,
R.ProductID,
R.OrderQty,
R.UnitPrice,
R.LineTotal
FROM AdventureWorks2014.Sales.SalesOrderDetail AS R
当前显示0,即使我在“其他”中说要显示我-
我认为您得到的是0,因为
saleorderid
的数据类型是int
。如果它将是varchar
,那么它将是-
。尝试下面的查询
Create table Orders (SalesOrderId Varchar(5), ProductId int, OrderQty int, UnitPrice decimal,
LineTotal decimal)
insert into Orders
values
(43659, 776, 1, 2024.94, 2024.99),
(43659, 777, 3, 2024.94, 2024.99),
(43659, 778, 1, 2024.94, 2024.99)
SELECT
CASE WHEN ROW_NUMBER() OVER(PARTITION BY SalesOrderID ORDER BY SalesOrderID ASC) = '1'
THEN SalesOrderID
ELSE '-' END AS SalesOrderID,
R.ProductID,
R.OrderQty,
R.UnitPrice,
R.LineTotal
FROM Orders AS R
您可以以数据类型int
和varchar
两种格式找到实时演示
在不更改数据类型的情况下,您可以使用如下所示的查询来实现它
SELECT
CASE WHEN ROW_NUMBER() OVER(PARTITION BY SalesOrderID ORDER BY SalesOrderID ASC) = '1'
THEN Convert(Varchar(5), SalesOrderID)
ELSE '-' END AS SalesOrderID,
R.ProductID,
R.OrderQty,
R.UnitPrice,
R.LineTotal
FROM OrdersInt AS R
下面的查询将解决您的问题
SELECT
CASE WHEN ROW_NUMBER() OVER(PARTITION BY SalesOrderID ORDER BY SalesOrderID ASC) = 1 THEN CONVERT(varchar(10),SalesOrderID) ELSE '-' END AS SalesOrderID,
R.ProductID,
R.OrderQty,
R.UnitPrice,
R.LineTotal
FROM AdventureWorks2014.Sales.SalesOrderDetail AS R
谢谢你的意见我成功了
SELECT CASE
WHEN ROW_NUMBER() OVER(PARTITION BY R.SalesOrderID ORDER BY SalesOrderID ASC) = 1 THEN SalesOrderID
ELSE ' ' END AS SO_ID,
R.ProductID,
R.OrderQty,
R.UnitPrice,
R.LineTotal
FROM(SELECT
CONVERT(VARCHAR(15),S.SalesOrderID) AS SalesOrderID,
S.ProductID,
S.OrderQty,
S.UnitPrice,
S.LineTotal
FROM AdventureWorks2014.Sales.SalesOrderDetail AS S) AS R
样本数据
这是因为您正在将“-”转换为一个数字。您需要将
SalesOrderID
转换为字符串以查看-(或执行类似的操作)。目前,由于salesorderid是一个整数,且整数的优先级高于字符串,因此case表达式尝试将“-”转换为整数,该整数仅为0。case
语句只能返回一种数据类型。在您的例子中,由于您需要一个破折号
,因此需要将SalesOrderID
转换为StringID,这是因为SalesOrderID的数据类型是int。请参阅我的答案。这是表的链接,它的数据类型如@Zabi链接所示:我认为你的答案是正确的,或者你想要其他东西?它应该在其他东西之后转换,但如果我在那里转换它,我就失去了定义输入的机会,转换不允许定义默认值。因此,我在FROM子句中使用子查询来转换SalesOrderID以解决此问题。好的,但是根据您的需要和输出,我创建了一个查询。该死,很抱歉,它实际工作了,将其标记为answer@ZabiSidiqkhil:谢谢