Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server:当Else为case时,它在case子句中将0显示为默认值_Sql Server - Fatal编程技术网

Sql server SQL Server:当Else为case时,它在case子句中将0显示为默认值

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 '-'

此查询在AdventureWorks2014.Sales.SalesOrderDetail表上运行

我的疑问是:在CASE子句中,我已经清楚地说明了,当它是ELSE时。此查询删除重复的SalesOrderID,在第一次显示后,应将其替换为“-”此字符

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:谢谢