Bonjour,
J'ai un problème de tri sur un champ alphanumérique qui contient du numéique
et de l'alphanumerique.
Je sais, ce n'est pas bien, mais je ne peux vraiment pas faire autrement car
ce sont des donnees imposees par les fournisseurs.
Je souhaiterais pouvoir trier avec, d'abord, tous les numériques triés dans
un ordre numériques et ensuite les alpha triés par ordre alphabétique.
Est-ce possible et si oui comment ?
Pouvoir obtenir quelque chose du genre
PAM 1
PAM 2
PAM 3
PAM 10
PAM 100
PAM A
PAM D1
...
RS 1
RS 2
...
RS 100
...
RS 1000
...
RS BAGUE
...
Merci
CREATE TABLE [dbo].[MARCHANDISE](
[MARC_ID] [int] IDENTITY(1,1) NOT NULL,
[MARC_CODEALPHA] [varchar](50) NOT NULL,
[MARC_CODENUM] [varchar](50) NOT NULL,
[MARC_CODEARTICLE] AS (([MARC_CODEALPHA]+' ')+[MARC_CODENUM]),
[MARC_CODETRI] AS
(([MARC_CODEALPHA]+replicate('0',(25)-len([MARC_CODENUM])))+[MARC_CODENUM]),
CONSTRAINT [PK_MARCHANDISE] PRIMARY KEY CLUSTERED
(
[MARC_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY > OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','1')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','2')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','3')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','10')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','11')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','12')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','A')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','B')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','98')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','99')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','D1')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','D2')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','100')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','101')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','P350')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','P2403')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','MOSDOLBG')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','1')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','2')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','3')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','100')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','101')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','CDO')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','1000')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','BAGUE')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','3700')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','3700 S/VA')
GO
Bonjour,
J'ai un problème de tri sur un champ alphanumérique qui contient du numéique
et de l'alphanumerique.
Je sais, ce n'est pas bien, mais je ne peux vraiment pas faire autrement car
ce sont des donnees imposees par les fournisseurs.
Je souhaiterais pouvoir trier avec, d'abord, tous les numériques triés dans
un ordre numériques et ensuite les alpha triés par ordre alphabétique.
Est-ce possible et si oui comment ?
Pouvoir obtenir quelque chose du genre
PAM 1
PAM 2
PAM 3
PAM 10
PAM 100
PAM A
PAM D1
...
RS 1
RS 2
...
RS 100
...
RS 1000
...
RS BAGUE
...
Merci
CREATE TABLE [dbo].[MARCHANDISE](
[MARC_ID] [int] IDENTITY(1,1) NOT NULL,
[MARC_CODEALPHA] [varchar](50) NOT NULL,
[MARC_CODENUM] [varchar](50) NOT NULL,
[MARC_CODEARTICLE] AS (([MARC_CODEALPHA]+' ')+[MARC_CODENUM]),
[MARC_CODETRI] AS
(([MARC_CODEALPHA]+replicate('0',(25)-len([MARC_CODENUM])))+[MARC_CODENUM]),
CONSTRAINT [PK_MARCHANDISE] PRIMARY KEY CLUSTERED
(
[MARC_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY > OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','1')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','2')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','3')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','10')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','11')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','12')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','A')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','B')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','98')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','99')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','D1')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','D2')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','100')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','101')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','P350')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','P2403')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','MOSDOLBG')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','1')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','2')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','3')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','100')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','101')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','CDO')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','1000')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','BAGUE')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','3700')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','3700 S/VA')
GO
Bonjour,
J'ai un problème de tri sur un champ alphanumérique qui contient du numéique
et de l'alphanumerique.
Je sais, ce n'est pas bien, mais je ne peux vraiment pas faire autrement car
ce sont des donnees imposees par les fournisseurs.
Je souhaiterais pouvoir trier avec, d'abord, tous les numériques triés dans
un ordre numériques et ensuite les alpha triés par ordre alphabétique.
Est-ce possible et si oui comment ?
Pouvoir obtenir quelque chose du genre
PAM 1
PAM 2
PAM 3
PAM 10
PAM 100
PAM A
PAM D1
...
RS 1
RS 2
...
RS 100
...
RS 1000
...
RS BAGUE
...
Merci
CREATE TABLE [dbo].[MARCHANDISE](
[MARC_ID] [int] IDENTITY(1,1) NOT NULL,
[MARC_CODEALPHA] [varchar](50) NOT NULL,
[MARC_CODENUM] [varchar](50) NOT NULL,
[MARC_CODEARTICLE] AS (([MARC_CODEALPHA]+' ')+[MARC_CODENUM]),
[MARC_CODETRI] AS
(([MARC_CODEALPHA]+replicate('0',(25)-len([MARC_CODENUM])))+[MARC_CODENUM]),
CONSTRAINT [PK_MARCHANDISE] PRIMARY KEY CLUSTERED
(
[MARC_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY > OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','1')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','2')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','3')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','10')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','11')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','12')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','A')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','B')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','98')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','99')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','D1')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','D2')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','100')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','101')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','P350')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','P2403')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','MOSDOLBG')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','1')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','2')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','3')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','100')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','101')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','CDO')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','1000')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','BAGUE')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','3700')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','3700 S/VA')
GO
Bonjour,
tout est possible en SQL. Mais un principe simple dit la chose suivante :
garbage in, garbage out.
Traduisible, par :
de la merde en entrée, de la merde en sortie.
Dans votre cas le non respect de la 1ere forme normale (mélange de deux
informations dans la même colonne) va se traduire par une requête
complexe horriblement couteuse, alors qu'il aurait été si simple de
faire deux colonnes.
Et si, VOUS POUVEZ FAIRE AUTREMENT ! Il suffit de respecter les
principes du développement base de données en dissociant la couche
physique de la couche logique et inversement.
Par exemple dans le champs de saisie de cette référence, on capture
chaque caractères. Tant qu'il est strictement alpha on le met dans la
colonne 1, dès qu'il devient nombre on le met dans la colonne 2, ceci
étant "transparent" dans lIHM :
à la saisie comme indiqué,
à l'affiche par le biais d'une vue qui recolle les deux colonnes !
Étonnement simple non ????
Alors pour votre requête :
SELECT *
FROM MARCHANDISE
ORDER BY MARC_CODEALPHA,
CASE ISNUMERIC(MARC_CODENUM)
WHEN 1
THEN CAST(MARC_CODENUM AS NUMERIC(38,0))
ELSE 99999999999999999999999999999999999999
END
A +
bruno a écrit :
> Bonjour,
>
> J'ai un problème de tri sur un champ alphanumérique qui contient du
> et de l'alphanumerique.
> Je sais, ce n'est pas bien, mais je ne peux vraiment pas faire autrement
> ce sont des donnees imposees par les fournisseurs.
>
> Je souhaiterais pouvoir trier avec, d'abord, tous les numériques triés
> un ordre numériques et ensuite les alpha triés par ordre alphabétique.
> Est-ce possible et si oui comment ?
>
> Pouvoir obtenir quelque chose du genre
>
> PAM 1
> PAM 2
> PAM 3
> PAM 10
> PAM 100
> PAM A
> PAM D1
> ...
> RS 1
> RS 2
> ...
> RS 100
> ...
> RS 1000
> ...
> RS BAGUE
> ...
>
> Merci
>
> CREATE TABLE [dbo].[MARCHANDISE](
> [MARC_ID] [int] IDENTITY(1,1) NOT NULL,
> [MARC_CODEALPHA] [varchar](50) NOT NULL,
> [MARC_CODENUM] [varchar](50) NOT NULL,
> [MARC_CODEARTICLE] AS (([MARC_CODEALPHA]+' ')+[MARC_CODENUM]),
> [MARC_CODETRI] AS
>
> CONSTRAINT [PK_MARCHANDISE] PRIMARY KEY CLUSTERED
> (
> [MARC_ID] ASC
> )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY > > OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
> ) ON [PRIMARY]
> GO
>
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','1')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','2')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','3')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','10')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','11')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','12')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','A')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','B')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','98')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','99')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','D1')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','D2')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','100')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','101')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','P350')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','P2403')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','MOSDOLBG')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('RS','1')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('RS','2')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('RS','3')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('RS','100')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('RS','101')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('RS','CDO')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('RS','1000')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('RS','BAGUE')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('RS','3700')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('RS','3700 S/VA')
> GO
>
>
--
Frédéric BROUARD - expert SGBDR et SQL - MVP SQL Server - 06 11 86 40 66
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Enseignant Arts & Métiers PACA, ISEN Toulon et CESI/EXIA Aix en Provence
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
*********************** http://www.sqlspot.com *************************
Bonjour,
tout est possible en SQL. Mais un principe simple dit la chose suivante :
garbage in, garbage out.
Traduisible, par :
de la merde en entrée, de la merde en sortie.
Dans votre cas le non respect de la 1ere forme normale (mélange de deux
informations dans la même colonne) va se traduire par une requête
complexe horriblement couteuse, alors qu'il aurait été si simple de
faire deux colonnes.
Et si, VOUS POUVEZ FAIRE AUTREMENT ! Il suffit de respecter les
principes du développement base de données en dissociant la couche
physique de la couche logique et inversement.
Par exemple dans le champs de saisie de cette référence, on capture
chaque caractères. Tant qu'il est strictement alpha on le met dans la
colonne 1, dès qu'il devient nombre on le met dans la colonne 2, ceci
étant "transparent" dans lIHM :
à la saisie comme indiqué,
à l'affiche par le biais d'une vue qui recolle les deux colonnes !
Étonnement simple non ????
Alors pour votre requête :
SELECT *
FROM MARCHANDISE
ORDER BY MARC_CODEALPHA,
CASE ISNUMERIC(MARC_CODENUM)
WHEN 1
THEN CAST(MARC_CODENUM AS NUMERIC(38,0))
ELSE 99999999999999999999999999999999999999
END
A +
bruno a écrit :
> Bonjour,
>
> J'ai un problème de tri sur un champ alphanumérique qui contient du
> et de l'alphanumerique.
> Je sais, ce n'est pas bien, mais je ne peux vraiment pas faire autrement
> ce sont des donnees imposees par les fournisseurs.
>
> Je souhaiterais pouvoir trier avec, d'abord, tous les numériques triés
> un ordre numériques et ensuite les alpha triés par ordre alphabétique.
> Est-ce possible et si oui comment ?
>
> Pouvoir obtenir quelque chose du genre
>
> PAM 1
> PAM 2
> PAM 3
> PAM 10
> PAM 100
> PAM A
> PAM D1
> ...
> RS 1
> RS 2
> ...
> RS 100
> ...
> RS 1000
> ...
> RS BAGUE
> ...
>
> Merci
>
> CREATE TABLE [dbo].[MARCHANDISE](
> [MARC_ID] [int] IDENTITY(1,1) NOT NULL,
> [MARC_CODEALPHA] [varchar](50) NOT NULL,
> [MARC_CODENUM] [varchar](50) NOT NULL,
> [MARC_CODEARTICLE] AS (([MARC_CODEALPHA]+' ')+[MARC_CODENUM]),
> [MARC_CODETRI] AS
>
> CONSTRAINT [PK_MARCHANDISE] PRIMARY KEY CLUSTERED
> (
> [MARC_ID] ASC
> )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY > > OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
> ) ON [PRIMARY]
> GO
>
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','1')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','2')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','3')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','10')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','11')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','12')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','A')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','B')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','98')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','99')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','D1')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','D2')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','100')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','101')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','P350')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','P2403')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','MOSDOLBG')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('RS','1')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('RS','2')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('RS','3')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('RS','100')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('RS','101')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('RS','CDO')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('RS','1000')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('RS','BAGUE')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('RS','3700')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('RS','3700 S/VA')
> GO
>
>
--
Frédéric BROUARD - expert SGBDR et SQL - MVP SQL Server - 06 11 86 40 66
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Enseignant Arts & Métiers PACA, ISEN Toulon et CESI/EXIA Aix en Provence
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
*********************** http://www.sqlspot.com *************************
Bonjour,
tout est possible en SQL. Mais un principe simple dit la chose suivante :
garbage in, garbage out.
Traduisible, par :
de la merde en entrée, de la merde en sortie.
Dans votre cas le non respect de la 1ere forme normale (mélange de deux
informations dans la même colonne) va se traduire par une requête
complexe horriblement couteuse, alors qu'il aurait été si simple de
faire deux colonnes.
Et si, VOUS POUVEZ FAIRE AUTREMENT ! Il suffit de respecter les
principes du développement base de données en dissociant la couche
physique de la couche logique et inversement.
Par exemple dans le champs de saisie de cette référence, on capture
chaque caractères. Tant qu'il est strictement alpha on le met dans la
colonne 1, dès qu'il devient nombre on le met dans la colonne 2, ceci
étant "transparent" dans lIHM :
à la saisie comme indiqué,
à l'affiche par le biais d'une vue qui recolle les deux colonnes !
Étonnement simple non ????
Alors pour votre requête :
SELECT *
FROM MARCHANDISE
ORDER BY MARC_CODEALPHA,
CASE ISNUMERIC(MARC_CODENUM)
WHEN 1
THEN CAST(MARC_CODENUM AS NUMERIC(38,0))
ELSE 99999999999999999999999999999999999999
END
A +
bruno a écrit :
> Bonjour,
>
> J'ai un problème de tri sur un champ alphanumérique qui contient du
> et de l'alphanumerique.
> Je sais, ce n'est pas bien, mais je ne peux vraiment pas faire autrement
> ce sont des donnees imposees par les fournisseurs.
>
> Je souhaiterais pouvoir trier avec, d'abord, tous les numériques triés
> un ordre numériques et ensuite les alpha triés par ordre alphabétique.
> Est-ce possible et si oui comment ?
>
> Pouvoir obtenir quelque chose du genre
>
> PAM 1
> PAM 2
> PAM 3
> PAM 10
> PAM 100
> PAM A
> PAM D1
> ...
> RS 1
> RS 2
> ...
> RS 100
> ...
> RS 1000
> ...
> RS BAGUE
> ...
>
> Merci
>
> CREATE TABLE [dbo].[MARCHANDISE](
> [MARC_ID] [int] IDENTITY(1,1) NOT NULL,
> [MARC_CODEALPHA] [varchar](50) NOT NULL,
> [MARC_CODENUM] [varchar](50) NOT NULL,
> [MARC_CODEARTICLE] AS (([MARC_CODEALPHA]+' ')+[MARC_CODENUM]),
> [MARC_CODETRI] AS
>
> CONSTRAINT [PK_MARCHANDISE] PRIMARY KEY CLUSTERED
> (
> [MARC_ID] ASC
> )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY > > OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
> ) ON [PRIMARY]
> GO
>
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','1')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','2')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','3')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','10')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','11')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','12')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','A')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','B')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','98')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','99')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','D1')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','D2')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','100')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','101')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','P350')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','P2403')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('PAM','MOSDOLBG')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('RS','1')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('RS','2')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('RS','3')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('RS','100')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('RS','101')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('RS','CDO')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('RS','1000')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('RS','BAGUE')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('RS','3700')
> GO
> INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
> VALUES('RS','3700 S/VA')
> GO
>
>
--
Frédéric BROUARD - expert SGBDR et SQL - MVP SQL Server - 06 11 86 40 66
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Enseignant Arts & Métiers PACA, ISEN Toulon et CESI/EXIA Aix en Provence
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
*********************** http://www.sqlspot.com *************************
Merci Fred,
Mais dans le type de données que j'ai, j'ai aussi des codes qui ressemblent
à
AIRLUX LV3900H ou ALCA P/5A01012P
dans lesquels les alpha et numériques sont mélangés dans la deuxième partie
du code.
En adaptant légèrement votre requete pour trier correctement (ou à peu près)
les alpha après les numériques cela fonctionne
SELECT *
FROM MARCHANDISE
where marc_codealpha='colles'
ORDER BY MARC_CODEALPHA,
CASE ISNUMERIC(MARC_CODENUM)
WHEN 1
THEN CAST(MARC_CODENUM AS NUMERIC(38,0))
ELSE 99999999999999999999999999999999999999
END,
CASE ISNUMERIC(MARC_CODENUM)
WHEN 0
THEN MARC_CODENUM
ELSE 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
END
Pensez-vous que ce serait possible de faire une colonne calculée qui
permettrait de trier toujours sur cette colonne (comme j'avais tenté de le
faire sur la colonne marc_codetri) ?
Et si oui pensez-vous que ce serait très couteux en terme de temps
d'exécution ?
Merci encore
Bruno
"Fred BROUARD" wrote in message
news:%23GDJV3w$Bonjour,
tout est possible en SQL. Mais un principe simple dit la chose suivante :
garbage in, garbage out.
Traduisible, par :
de la merde en entrée, de la merde en sortie.
Dans votre cas le non respect de la 1ere forme normale (mélange de deux
informations dans la même colonne) va se traduire par une requête
complexe horriblement couteuse, alors qu'il aurait été si simple de
faire deux colonnes.
Et si, VOUS POUVEZ FAIRE AUTREMENT ! Il suffit de respecter les
principes du développement base de données en dissociant la couche
physique de la couche logique et inversement.
Par exemple dans le champs de saisie de cette référence, on capture
chaque caractères. Tant qu'il est strictement alpha on le met dans la
colonne 1, dès qu'il devient nombre on le met dans la colonne 2, ceci
étant "transparent" dans lIHM :
à la saisie comme indiqué,
à l'affiche par le biais d'une vue qui recolle les deux colonnes !
Étonnement simple non ????
Alors pour votre requête :
SELECT *
FROM MARCHANDISE
ORDER BY MARC_CODEALPHA,
CASE ISNUMERIC(MARC_CODENUM)
WHEN 1
THEN CAST(MARC_CODENUM AS NUMERIC(38,0))
ELSE 99999999999999999999999999999999999999
END
A +
bruno a écrit :Bonjour,
J'ai un problème de tri sur un champ alphanumérique qui contient du
numéiqueet de l'alphanumerique.
Je sais, ce n'est pas bien, mais je ne peux vraiment pas faire autrement
carce sont des donnees imposees par les fournisseurs.
Je souhaiterais pouvoir trier avec, d'abord, tous les numériques triés
dansun ordre numériques et ensuite les alpha triés par ordre alphabétique.
Est-ce possible et si oui comment ?
Pouvoir obtenir quelque chose du genre
PAM 1
PAM 2
PAM 3
PAM 10
PAM 100
PAM A
PAM D1
...
RS 1
RS 2
...
RS 100
...
RS 1000
...
RS BAGUE
...
Merci
CREATE TABLE [dbo].[MARCHANDISE](
[MARC_ID] [int] IDENTITY(1,1) NOT NULL,
[MARC_CODEALPHA] [varchar](50) NOT NULL,
[MARC_CODENUM] [varchar](50) NOT NULL,
[MARC_CODEARTICLE] AS (([MARC_CODEALPHA]+' ')+[MARC_CODENUM]),
[MARC_CODETRI] AS
(([MARC_CODEALPHA]+replicate('0',(25)-len([MARC_CODENUM])))+[MARC_CODENUM]),CONSTRAINT [PK_MARCHANDISE] PRIMARY KEY CLUSTERED
(
[MARC_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY >>> OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','1')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','2')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','3')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','10')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','11')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','12')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','A')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','B')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','98')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','99')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','D1')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','D2')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','100')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','101')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','P350')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','P2403')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','MOSDOLBG')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','1')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','2')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','3')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','100')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','101')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','CDO')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','1000')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','BAGUE')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','3700')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','3700 S/VA')
GO
--
Frédéric BROUARD - expert SGBDR et SQL - MVP SQL Server - 06 11 86 40 66
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Enseignant Arts & Métiers PACA, ISEN Toulon et CESI/EXIA Aix en Provence
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
*********************** http://www.sqlspot.com *************************
Merci Fred,
Mais dans le type de données que j'ai, j'ai aussi des codes qui ressemblent
à
AIRLUX LV3900H ou ALCA P/5A01012P
dans lesquels les alpha et numériques sont mélangés dans la deuxième partie
du code.
En adaptant légèrement votre requete pour trier correctement (ou à peu près)
les alpha après les numériques cela fonctionne
SELECT *
FROM MARCHANDISE
where marc_codealpha='colles'
ORDER BY MARC_CODEALPHA,
CASE ISNUMERIC(MARC_CODENUM)
WHEN 1
THEN CAST(MARC_CODENUM AS NUMERIC(38,0))
ELSE 99999999999999999999999999999999999999
END,
CASE ISNUMERIC(MARC_CODENUM)
WHEN 0
THEN MARC_CODENUM
ELSE 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
END
Pensez-vous que ce serait possible de faire une colonne calculée qui
permettrait de trier toujours sur cette colonne (comme j'avais tenté de le
faire sur la colonne marc_codetri) ?
Et si oui pensez-vous que ce serait très couteux en terme de temps
d'exécution ?
Merci encore
Bruno
"Fred BROUARD" <brouardf@club-internet.fr> wrote in message
news:%23GDJV3w$KHA.1700@TK2MSFTNGP02.phx.gbl...
Bonjour,
tout est possible en SQL. Mais un principe simple dit la chose suivante :
garbage in, garbage out.
Traduisible, par :
de la merde en entrée, de la merde en sortie.
Dans votre cas le non respect de la 1ere forme normale (mélange de deux
informations dans la même colonne) va se traduire par une requête
complexe horriblement couteuse, alors qu'il aurait été si simple de
faire deux colonnes.
Et si, VOUS POUVEZ FAIRE AUTREMENT ! Il suffit de respecter les
principes du développement base de données en dissociant la couche
physique de la couche logique et inversement.
Par exemple dans le champs de saisie de cette référence, on capture
chaque caractères. Tant qu'il est strictement alpha on le met dans la
colonne 1, dès qu'il devient nombre on le met dans la colonne 2, ceci
étant "transparent" dans lIHM :
à la saisie comme indiqué,
à l'affiche par le biais d'une vue qui recolle les deux colonnes !
Étonnement simple non ????
Alors pour votre requête :
SELECT *
FROM MARCHANDISE
ORDER BY MARC_CODEALPHA,
CASE ISNUMERIC(MARC_CODENUM)
WHEN 1
THEN CAST(MARC_CODENUM AS NUMERIC(38,0))
ELSE 99999999999999999999999999999999999999
END
A +
bruno a écrit :
Bonjour,
J'ai un problème de tri sur un champ alphanumérique qui contient du
numéique
et de l'alphanumerique.
Je sais, ce n'est pas bien, mais je ne peux vraiment pas faire autrement
car
ce sont des donnees imposees par les fournisseurs.
Je souhaiterais pouvoir trier avec, d'abord, tous les numériques triés
dans
un ordre numériques et ensuite les alpha triés par ordre alphabétique.
Est-ce possible et si oui comment ?
Pouvoir obtenir quelque chose du genre
PAM 1
PAM 2
PAM 3
PAM 10
PAM 100
PAM A
PAM D1
...
RS 1
RS 2
...
RS 100
...
RS 1000
...
RS BAGUE
...
Merci
CREATE TABLE [dbo].[MARCHANDISE](
[MARC_ID] [int] IDENTITY(1,1) NOT NULL,
[MARC_CODEALPHA] [varchar](50) NOT NULL,
[MARC_CODENUM] [varchar](50) NOT NULL,
[MARC_CODEARTICLE] AS (([MARC_CODEALPHA]+' ')+[MARC_CODENUM]),
[MARC_CODETRI] AS
(([MARC_CODEALPHA]+replicate('0',(25)-len([MARC_CODENUM])))+[MARC_CODENUM]),
CONSTRAINT [PK_MARCHANDISE] PRIMARY KEY CLUSTERED
(
[MARC_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY >>> OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','1')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','2')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','3')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','10')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','11')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','12')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','A')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','B')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','98')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','99')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','D1')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','D2')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','100')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','101')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','P350')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','P2403')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','MOSDOLBG')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','1')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','2')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','3')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','100')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','101')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','CDO')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','1000')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','BAGUE')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','3700')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','3700 S/VA')
GO
--
Frédéric BROUARD - expert SGBDR et SQL - MVP SQL Server - 06 11 86 40 66
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Enseignant Arts & Métiers PACA, ISEN Toulon et CESI/EXIA Aix en Provence
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
*********************** http://www.sqlspot.com *************************
Merci Fred,
Mais dans le type de données que j'ai, j'ai aussi des codes qui ressemblent
à
AIRLUX LV3900H ou ALCA P/5A01012P
dans lesquels les alpha et numériques sont mélangés dans la deuxième partie
du code.
En adaptant légèrement votre requete pour trier correctement (ou à peu près)
les alpha après les numériques cela fonctionne
SELECT *
FROM MARCHANDISE
where marc_codealpha='colles'
ORDER BY MARC_CODEALPHA,
CASE ISNUMERIC(MARC_CODENUM)
WHEN 1
THEN CAST(MARC_CODENUM AS NUMERIC(38,0))
ELSE 99999999999999999999999999999999999999
END,
CASE ISNUMERIC(MARC_CODENUM)
WHEN 0
THEN MARC_CODENUM
ELSE 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
END
Pensez-vous que ce serait possible de faire une colonne calculée qui
permettrait de trier toujours sur cette colonne (comme j'avais tenté de le
faire sur la colonne marc_codetri) ?
Et si oui pensez-vous que ce serait très couteux en terme de temps
d'exécution ?
Merci encore
Bruno
"Fred BROUARD" wrote in message
news:%23GDJV3w$Bonjour,
tout est possible en SQL. Mais un principe simple dit la chose suivante :
garbage in, garbage out.
Traduisible, par :
de la merde en entrée, de la merde en sortie.
Dans votre cas le non respect de la 1ere forme normale (mélange de deux
informations dans la même colonne) va se traduire par une requête
complexe horriblement couteuse, alors qu'il aurait été si simple de
faire deux colonnes.
Et si, VOUS POUVEZ FAIRE AUTREMENT ! Il suffit de respecter les
principes du développement base de données en dissociant la couche
physique de la couche logique et inversement.
Par exemple dans le champs de saisie de cette référence, on capture
chaque caractères. Tant qu'il est strictement alpha on le met dans la
colonne 1, dès qu'il devient nombre on le met dans la colonne 2, ceci
étant "transparent" dans lIHM :
à la saisie comme indiqué,
à l'affiche par le biais d'une vue qui recolle les deux colonnes !
Étonnement simple non ????
Alors pour votre requête :
SELECT *
FROM MARCHANDISE
ORDER BY MARC_CODEALPHA,
CASE ISNUMERIC(MARC_CODENUM)
WHEN 1
THEN CAST(MARC_CODENUM AS NUMERIC(38,0))
ELSE 99999999999999999999999999999999999999
END
A +
bruno a écrit :Bonjour,
J'ai un problème de tri sur un champ alphanumérique qui contient du
numéiqueet de l'alphanumerique.
Je sais, ce n'est pas bien, mais je ne peux vraiment pas faire autrement
carce sont des donnees imposees par les fournisseurs.
Je souhaiterais pouvoir trier avec, d'abord, tous les numériques triés
dansun ordre numériques et ensuite les alpha triés par ordre alphabétique.
Est-ce possible et si oui comment ?
Pouvoir obtenir quelque chose du genre
PAM 1
PAM 2
PAM 3
PAM 10
PAM 100
PAM A
PAM D1
...
RS 1
RS 2
...
RS 100
...
RS 1000
...
RS BAGUE
...
Merci
CREATE TABLE [dbo].[MARCHANDISE](
[MARC_ID] [int] IDENTITY(1,1) NOT NULL,
[MARC_CODEALPHA] [varchar](50) NOT NULL,
[MARC_CODENUM] [varchar](50) NOT NULL,
[MARC_CODEARTICLE] AS (([MARC_CODEALPHA]+' ')+[MARC_CODENUM]),
[MARC_CODETRI] AS
(([MARC_CODEALPHA]+replicate('0',(25)-len([MARC_CODENUM])))+[MARC_CODENUM]),CONSTRAINT [PK_MARCHANDISE] PRIMARY KEY CLUSTERED
(
[MARC_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY >>> OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','1')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','2')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','3')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','10')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','11')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','12')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','A')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','B')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','98')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','99')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','D1')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','D2')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','100')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','101')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','P350')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','P2403')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('PAM','MOSDOLBG')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','1')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','2')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','3')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','100')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','101')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','CDO')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','1000')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','BAGUE')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','3700')
GO
INSERT INTO [MARCHANDISE] ([MARC_CODEALPHA],[MARC_CODENUM])
VALUES('RS','3700 S/VA')
GO
--
Frédéric BROUARD - expert SGBDR et SQL - MVP SQL Server - 06 11 86 40 66
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Enseignant Arts & Métiers PACA, ISEN Toulon et CESI/EXIA Aix en Provence
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
*********************** http://www.sqlspot.com *************************