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 -
3 Réponses :
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
Son type de données est indiqué dans le lien red-gate.com/products/sql-development/sql-doc//browse-sql-do c /…
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
@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
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
p >
C'est parce que vous convertissez «-» en nombre ici. Vous devez convertir
SalesOrderIDen 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
CASEne peut renvoyer qu'un seul type de données. Dans votre cas, puisque vous vouliez untiret, vous devez donc convertirSalesOrderIDen chaîneC'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 /…