3
votes

SQL Server: lorsque Else est le cas, il affiche 0 par défaut dans la clause CASE

Cette requête est exécutée sur la table AdventureWorks2014.Sales.SalesOrderDetail.

Ma requête: dans la clause CASE, j'ai clairement indiqué de montrer - quand c'est le cas ELSE. Cette requête supprime le SalesOrderID qui se répète et après la première fois, il doit être remplacé par "-" ce caractère.

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

affiche actuellement 0 même si j'ai dit dans ELSE de me montrer -

 entrez la description de l'image ici


3 commentaires

C'est parce que vous convertissez «-» en nombre ici. Vous devez convertir SalesOrderID en une chaîne pour voir le - (ou faire quelque chose avec un effet similaire). Dans l'état actuel des choses, étant donné que salesorderid est un entier et que les entiers ont une priorité plus élevée que les chaînes, l'expression case essaie de convertir «-» en un entier, qui est juste 0.


L'instruction CASE ne peut renvoyer qu'un seul type de données. Dans votre cas, puisque vous vouliez un tiret , vous devez donc convertir SalesOrderID en chaîne


C'est parce que le type de données de SalesOrderId est int. Voyez ma réponse. Voici le lien de la table red-gate.com/products/sql-development/sql-doc//browse-sql-do‌ c /…


3 Réponses :


0
votes

Je pense que vous obtenez 0 car le type de données de SalesOrderId est int . Si ce sera varchar alors il viendra - . Essayez cette requête ci-dessous.

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

Vous pouvez trouver la démo en direct Démo en direct ici dans les deux formats de type de données int et varchar.

Sans changer de type de données, vous pouvez y parvenir en utilisant la requête comme indiqué ci-dessous

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


1 commentaires

4
votes

La requête ci-dessous résoudra votre problème

 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


5 commentaires

@Zabi: Je pense que ta réponse est la bonne ou tu veux autre chose?


il devrait être converti après ELSE mais toujours si je le convertis là, je perds l'opportunité de définir mon entrée et CONVERT ne permet pas de définir les valeurs par défaut. Donc, j'ai utilisé la sous-requête dans la clause FROM pour convertir le SalesOrderID pour résoudre ce problème.


OK, mais selon vos besoins et résultats, j'ai créé une requête.


putain, désolé ça marche réellement, marqué comme une réponse


@ZabiSidiqkhil: Merci



0
votes

Merci pour votre contribution, je l'ai fait fonctionner

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

Exemple de données

 entrez la description de l'image ici

p >


0 commentaires