Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comment dupliquer des lignes dans un select ?

3 réponses
Avatar
Jean-Paul
Bonjour

Je m'explique

J'ai une vue qui me renvoie ceci

<Ref Art>, <Qte>
donc par exemple
19992222GH, 7
1999456zGX, 4
19456722GY, 2

mais en fait j'aimerais obtenir la chose suivant :
19992222GH, 7
19992222GH, 7
19992222GH, 7
19992222GH, 7
19992222GH, 7
19992222GH, 7
19992222GH, 7
1999456zGX, 4
1999456zGX, 4
1999456zGX, 4
1999456zGX, 4
1999456zGX, 4
19456722GY, 2
19456722GY, 2

Connaissez vous un moyen simple dans une requete SQL ?
Sans passer par une table intermediaire.

3 réponses

Avatar
Patrice
Le plus simple serait sans doute de créer une table de nombres et de faire
une jointure. Quelqu'un aura peut-être une autre idée ?

Quel est l'objectif final ? (toutes les lignes auront toujours toutes leurs
données identiques ? Si oui, je ne vois pas trop l'avantage d'avoir une
ligne par instance d'article. Si non, il faudrait sans doute gérer alors de
toute façon explictement chaque instance d'article).

--
Patrice

"Jean-Paul" a écrit dans le message de
news:
Bonjour

Je m'explique

J'ai une vue qui me renvoie ceci

<Ref Art>, <Qte>
donc par exemple
19992222GH, 7
1999456zGX, 4
19456722GY, 2

mais en fait j'aimerais obtenir la chose suivant :
19992222GH, 7
19992222GH, 7
19992222GH, 7
19992222GH, 7
19992222GH, 7
19992222GH, 7
19992222GH, 7
1999456zGX, 4
1999456zGX, 4
1999456zGX, 4
1999456zGX, 4
1999456zGX, 4
19456722GY, 2
19456722GY, 2

Connaissez vous un moyen simple dans une requete SQL ?
Sans passer par une table intermediaire.


Avatar
Christian Robert
J'ai prix l'emple sur AdventureWorks sur SQL 2005.

Effectivement la table de nombre peut être très utile, ma table s'appelle
nums et son champ unique num :

SELECT * FROM Person.Contact JOIN nums ON ContactId >= nums.num
WHERE ContactId <= 10

dans ce cas sinon sur SQL Server 2005 avec une fonction et CROSS APPLY

SELECT * FROM Person.Contact CROSS APPLY fn_nums(ContactId)
WHERE ContactId <= 10

et la définition de fn_nums:

CREATE FUNCTION dbo.fn_nums(@n AS BIGINT) RETURNS TABLE
AS
RETURN
WITH
L0 AS(SELECT 1 AS c UNION ALL SELECT 1),
L1 AS(SELECT 1 AS c FROM L0 AS A, L0 AS B),
L2 AS(SELECT 1 AS c FROM L1 AS A, L1 AS B),
L3 AS(SELECT 1 AS c FROM L2 AS A, L2 AS B),
L4 AS(SELECT 1 AS c FROM L3 AS A, L3 AS B),
L5 AS(SELECT 1 AS c FROM L4 AS A, L4 AS B),
Nums AS(SELECT ROW_NUMBER() OVER(ORDER BY c) AS n FROM L5)
SELECT n FROM Nums WHERE n <= @n;
GO

Voilà

--
Cordialement

Christian Robert
Consultant - Formateur chez Winwise
MCT - MCDBA - MCSD
MCTS & MCITP SQL Server 2005


"Patrice" a écrit :

Le plus simple serait sans doute de créer une table de nombres et de faire
une jointure. Quelqu'un aura peut-être une autre idée ?

Quel est l'objectif final ? (toutes les lignes auront toujours toutes leurs
données identiques ? Si oui, je ne vois pas trop l'avantage d'avoir une
ligne par instance d'article. Si non, il faudrait sans doute gérer alors de
toute façon explictement chaque instance d'article).

--
Patrice

"Jean-Paul" a écrit dans le message de
news:
> Bonjour
>
> Je m'explique
>
> J'ai une vue qui me renvoie ceci
>
> <Ref Art>, <Qte>
> donc par exemple
> 19992222GH, 7
> 1999456zGX, 4
> 19456722GY, 2
>
> mais en fait j'aimerais obtenir la chose suivant :
> 19992222GH, 7
> 19992222GH, 7
> 19992222GH, 7
> 19992222GH, 7
> 19992222GH, 7
> 19992222GH, 7
> 19992222GH, 7
> 1999456zGX, 4
> 1999456zGX, 4
> 1999456zGX, 4
> 1999456zGX, 4
> 1999456zGX, 4
> 19456722GY, 2
> 19456722GY, 2
>
> Connaissez vous un moyen simple dans une requete SQL ?
> Sans passer par une table intermediaire.





Avatar
Jean-Paul
Merci de la réponse

Pour répondre à ta question Patrice, les enregistrements sont
identiques mais c'est fait exprés. C'est pour imprimer dans un
état crystal des codes barres et il m'en faut autant que les quantités
de mes articles avec même une valeur en % gérant un surplus.
Quant à la table des nombres c'est la solution que j'ai utilisée.
Mais la table est figée et cela me génait même je suis allé jusqu'à
2000 soit 2.000.100 lignes !...

Pour la table

"Christian Robert" a écrit :

J'ai prix l'emple sur AdventureWorks sur SQL 2005.

Effectivement la table de nombre peut être très utile, ma table s'appelle
nums et son champ unique num :

SELECT * FROM Person.Contact JOIN nums ON ContactId >= nums.num
WHERE ContactId <= 10

dans ce cas sinon sur SQL Server 2005 avec une fonction et CROSS APPLY

SELECT * FROM Person.Contact CROSS APPLY fn_nums(ContactId)
WHERE ContactId <= 10

et la définition de fn_nums:

CREATE FUNCTION dbo.fn_nums(@n AS BIGINT) RETURNS TABLE
AS
RETURN
WITH
L0 AS(SELECT 1 AS c UNION ALL SELECT 1),
L1 AS(SELECT 1 AS c FROM L0 AS A, L0 AS B),
L2 AS(SELECT 1 AS c FROM L1 AS A, L1 AS B),
L3 AS(SELECT 1 AS c FROM L2 AS A, L2 AS B),
L4 AS(SELECT 1 AS c FROM L3 AS A, L3 AS B),
L5 AS(SELECT 1 AS c FROM L4 AS A, L4 AS B),
Nums AS(SELECT ROW_NUMBER() OVER(ORDER BY c) AS n FROM L5)
SELECT n FROM Nums WHERE n <= @n;
GO

Voilà

--
Cordialement

Christian Robert
Consultant - Formateur chez Winwise
MCT - MCDBA - MCSD
MCTS & MCITP SQL Server 2005


"Patrice" a écrit :

> Le plus simple serait sans doute de créer une table de nombres et de faire
> une jointure. Quelqu'un aura peut-être une autre idée ?
>
> Quel est l'objectif final ? (toutes les lignes auront toujours toutes leurs
> données identiques ? Si oui, je ne vois pas trop l'avantage d'avoir une
> ligne par instance d'article. Si non, il faudrait sans doute gérer alors de
> toute façon explictement chaque instance d'article).
>
> --
> Patrice
>
> "Jean-Paul" a écrit dans le message de
> news:
> > Bonjour
> >
> > Je m'explique
> >
> > J'ai une vue qui me renvoie ceci
> >
> > <Ref Art>, <Qte>
> > donc par exemple
> > 19992222GH, 7
> > 1999456zGX, 4
> > 19456722GY, 2
> >
> > mais en fait j'aimerais obtenir la chose suivant :
> > 19992222GH, 7
> > 19992222GH, 7
> > 19992222GH, 7
> > 19992222GH, 7
> > 19992222GH, 7
> > 19992222GH, 7
> > 19992222GH, 7
> > 1999456zGX, 4
> > 1999456zGX, 4
> > 1999456zGX, 4
> > 1999456zGX, 4
> > 1999456zGX, 4
> > 19456722GY, 2
> > 19456722GY, 2
> >
> > Connaissez vous un moyen simple dans une requete SQL ?
> > Sans passer par une table intermediaire.
>
>
>