OVH Cloud OVH Cloud

Problème en T-SQL

8 réponses
Avatar
Jay Mathieu
Bonjour tout le monde,

Je suis un peu nouveau dans ce joli monde de SQL, et j'ai un petit problème
pour vous :

J'ai une table qui ressemble a ca :
Year Amount
---- ------
1990 1.1
1990 1.2
1990 1.3
1990 1.4
1991 2.1
1991 2.2
1991 2.3
1991 2.4
1992 4.2
1993 5.1
1993 5.2

Et je veux que ca me donne ca :
Year Quarter Amount
---- ------- ------
1990 1 1.1
1990 2 1.2
1990 3 1.3
1990 4 1.4
1991 1 2.1
1991 2 2.2
1991 3 2.3
1991 4 2.4
1992 1 4.2
1993 1 5.1
1993 2 5.2

Est-ce possible avec un Select ????
En gros, le but du jeu est de calculer le nombre de fois qu'une meme année
est apparue.

Merci Beaucoup !!

Mathieu.

8 réponses

Avatar
+The_Taco+
Tu peux faire bien plus simple!
Tu fait un SELECT COUNT(*) FROM tatable WHERE Year = 1990
Donc tu n'es pas obligé d'avoir une colone qui sert à ça!

"Jay Mathieu" a écrit dans le message de
news:bhg9hj$ted$
Bonjour tout le monde,

Je suis un peu nouveau dans ce joli monde de SQL, et j'ai un petit


problème
pour vous :

J'ai une table qui ressemble a ca :
Year Amount
---- ------
1990 1.1
1990 1.2
1990 1.3
1990 1.4
1991 2.1
1991 2.2
1991 2.3
1991 2.4
1992 4.2
1993 5.1
1993 5.2

Et je veux que ca me donne ca :
Year Quarter Amount
---- ------- ------
1990 1 1.1
1990 2 1.2
1990 3 1.3
1990 4 1.4
1991 1 2.1
1991 2 2.2
1991 3 2.3
1991 4 2.4
1992 1 4.2
1993 1 5.1
1993 2 5.2

Est-ce possible avec un Select ????
En gros, le but du jeu est de calculer le nombre de fois qu'une meme année
est apparue.

Merci Beaucoup !!

Mathieu.




Avatar
Steve Kass
Fred,

Ta requête ne donne pas les résultats voulus. Mathieu veut

1992 1 4.2

plutôt que

1992 2 4.2

Pourquoi le "Amount" serait-il limité dans la periode
de 1990-04-01 à 1990-06-30 aux valeurs dont le
3ème caractère est '2'?

SK

Fred BROUARD wrote:

SELECT Year, SUBSTRING(Amount, 3, 1) As Quarter, Amount
FROM [J'ai une table qui ressemble a ca]

A +

Jay Mathieu a écrit:

Bonjour tout le monde,

Je suis un peu nouveau dans ce joli monde de SQL, et j'ai un petit
problème
pour vous :

J'ai une table qui ressemble a ca :
Year Amount
---- ------
1990 1.1
1990 1.2
1990 1.3
1990 1.4
1991 2.1
1991 2.2
1991 2.3
1991 2.4
1992 4.2
1993 5.1
1993 5.2

Et je veux que ca me donne ca :
Year Quarter Amount
---- ------- ------
1990 1 1.1
1990 2 1.2
1990 3 1.3
1990 4 1.4
1991 1 2.1
1991 2 2.2
1991 3 2.3
1991 4 2.4
1992 1 4.2
1993 1 5.1
1993 2 5.2

Est-ce possible avec un Select ????
En gros, le but du jeu est de calculer le nombre de fois qu'une meme
année
est apparue.

Merci Beaucoup !!

Mathieu.







Avatar
Jay Mathieu
Merci d'avoir répondu. Mais en fait je ne cherche pas à connaitre le nombre
de fios que l'année est répété

"+The_Taco+" wrote in message
news:uh7Y8#
Tu peux faire bien plus simple!
Tu fait un SELECT COUNT(*) FROM tatable WHERE Year = 1990
Donc tu n'es pas obligé d'avoir une colone qui sert à ça!

"Jay Mathieu" a écrit dans le message de
news:bhg9hj$ted$
> Bonjour tout le monde,
>
> Je suis un peu nouveau dans ce joli monde de SQL, et j'ai un petit
problème
> pour vous :
>
> J'ai une table qui ressemble a ca :
> Year Amount
> ---- ------
> 1990 1.1
> 1990 1.2
> 1990 1.3
> 1990 1.4
> 1991 2.1
> 1991 2.2
> 1991 2.3
> 1991 2.4
> 1992 4.2
> 1993 5.1
> 1993 5.2
>
> Et je veux que ca me donne ca :
> Year Quarter Amount
> ---- ------- ------
> 1990 1 1.1
> 1990 2 1.2
> 1990 3 1.3
> 1990 4 1.4
> 1991 1 2.1
> 1991 2 2.2
> 1991 3 2.3
> 1991 4 2.4
> 1992 1 4.2
> 1993 1 5.1
> 1993 2 5.2
>
> Est-ce possible avec un Select ????
> En gros, le but du jeu est de calculer le nombre de fois qu'une meme


année
> est apparue.
>
> Merci Beaucoup !!
>
> Mathieu.
>
>




Avatar
Jay Mathieu
en fait, il n'y a pas de règle, faut seulement que la première fois que l'on
voi l'année 1990, on mette 1, la 2ième fois on met 2, la 3ième fois ... 3
.... et quelque soit la valeur du Amount


"Steve Kass" wrote in message
news:
Jay,

Ta table a 4 rangées dont l'année est 1990, et il ne me
semble pas possible de determiner laquelle correspond au
quarter 1, laquelle au quarter 2, etc. Pourriez-vous donnez
un regle pour décider le quarter à partir des valeurs d'une
rangée?

-- Steve Kass
-- Drew University
-- Ref: E285A187-E263-4CCE-BA42-2AE0DAA4533D

Jay Mathieu wrote:

> Bonjour tout le monde,
>
>Je suis un peu nouveau dans ce joli monde de SQL, et j'ai un petit


problème
>pour vous :
>
>J'ai une table qui ressemble a ca :
>Year Amount
>---- ------
>1990 1.1
>1990 1.2
>1990 1.3
>1990 1.4
>1991 2.1
>1991 2.2
>1991 2.3
>1991 2.4
>1992 4.2
>1993 5.1
>1993 5.2
>
>Et je veux que ca me donne ca :
>Year Quarter Amount
>---- ------- ------
>1990 1 1.1
>1990 2 1.2
>1990 3 1.3
>1990 4 1.4
>1991 1 2.1
>1991 2 2.2
>1991 3 2.3
>1991 4 2.4
>1992 1 4.2
>1993 1 5.1
>1993 2 5.2
>
>Est-ce possible avec un Select ????
>En gros, le but du jeu est de calculer le nombre de fois qu'une meme


année
>est apparue.
>
>Merci Beaucoup !!
>
>Mathieu.
>
>
>
>



Avatar
Jay Mathieu
Bon je me suis mal exprimé ... mais merci a tous d'avoir répondu .
Je n'ai toujours pas trouvé de solution (si ce n'est avec un cursor, mais ca
j'ai pas envie)
Donc la question est toujours ouverte. Le complèment d'information de la
question de "Steve Kass" est très utile...
Bon ben envore une fois merci a tous, et si vous pouvez encore un peu
m'aider sur ce sujet, ca seré sympatique !!

@+,Mathieu.
Avatar
Steve Kass
Jay,

Il est tout-à-fait possible que la requête

SELECT * FROM T
ORDER BY Year

executée aujourd'hui donnera

Year Amount
---- ------
1990 1.1
1990 1.2
1990 1.3
1990 1.4
1991 2.1
1991 2.2
1991 2.3
1991 2.4
1992 4.2
1993 5.1
1993 5.2

mais executée demain donnera

Year Amount
---- ------
1990 1.3
1990 1.2
1990 1.1
1990 1.4
1991 2.2
1991 2.3
1991 2.1
1991 2.3
1991 2.4
1992 4.2
1993 5.2
1993 5.1


Les rangées d'une table n'ont pas une ordre
propre - par contre ce sont comme des billes
dans un sac, et elles ne se rangent en ordre qu'au
moment de sélection.

Je vois deux possibilités:

1. Dans cet exemple, les valeurs [Amount] se présentent
en ordre croissant. Si vous croyez que la valeur de
"Quarter 1" est toujours la valeur la plus petite
d'une année, Quarter 2 est la plus petite des restes, etc.,

alter table T add Quarter tinyint
update T set
Quarter = (
select count(*) from T T2
where T2.Year = T.Year
and T2.Year <= T.Year
)

Au cas de duplication d'une valeur Amount, vous
trouverez des répétitions dans la colonne Quarter.


2. On peut espérer (sans garantie) que l'on peut
insérer les rangées dans une table temporaire
dans l'ordre voulue avec une colonne unique:

select identity(int, 1, 1) as pk, Year, Amount, cast(1 as tinyint) as
Quarter
into #T from T
go

update #T set
Quarter = (
select count(*) from #T T2
where T2.Year = #T.Year
and T2.pk <= #T.pk
)
go

truncate table T
alter table T add Quarter tinyint
insert into T select Year, Amount, Quarter from #T

SK





Sans pouvoir identifier une propriété

La sequence de présentation de vos rangées dans le
resultat de SELECT * FROM T n'est pas une propriété de la rangée,
et il n'y a aucune garantie que cette ordre sera toujours
la même, sans ajouter ORDER BY <expression>

que la requête présentent les données
dans une certaine ordre, il est impossible de

Le problème est que

Jay Mathieu wrote:

en fait, il n'y a pas de règle, faut seulement que la première fois que l'on
voi l'année 1990, on mette 1, la 2ième fois on met 2, la 3ième fois ... 3
.... et quelque soit la valeur du Amount


"Steve Kass" wrote in message
news:


Jay,

Ta table a 4 rangées dont l'année est 1990, et il ne me
semble pas possible de determiner laquelle correspond au
quarter 1, laquelle au quarter 2, etc. Pourriez-vous donnez
un regle pour décider le quarter à partir des valeurs d'une
rangée?

-- Steve Kass
-- Drew University
-- Ref: E285A187-E263-4CCE-BA42-2AE0DAA4533D

Jay Mathieu wrote:



Bonjour tout le monde,

Je suis un peu nouveau dans ce joli monde de SQL, et j'ai un petit






problème


pour vous :

J'ai une table qui ressemble a ca :
Year Amount
---- ------
1990 1.1
1990 1.2
1990 1.3
1990 1.4
1991 2.1
1991 2.2
1991 2.3
1991 2.4
1992 4.2
1993 5.1
1993 5.2

Et je veux que ca me donne ca :
Year Quarter Amount
---- ------- ------
1990 1 1.1
1990 2 1.2
1990 3 1.3
1990 4 1.4
1991 1 2.1
1991 2 2.2
1991 3 2.3
1991 4 2.4
1992 1 4.2
1993 1 5.1
1993 2 5.2

Est-ce possible avec un Select ????
En gros, le but du jeu est de calculer le nombre de fois qu'une meme






année


est apparue.

Merci Beaucoup !!

Mathieu.
















Avatar
Jay Mathieu
Bon ... ca ne marche pas ...
L'Item sera toujours différent, donc je prends la 1ière solution (la moins
compliqué).

Donc le code me renvoi ca (escuse-moi d'avoir changer le nom des colonnes !)
:

Item NumLot Quart
1990 1.3 4
1990 1.2 4
1990 1.1 4
1990 1.4 4
1991 2.2 1

Tu comprends pourquoi ? (moi pas)
Avatar
Steve Kass
Jay,

J'ai mis [Year] à la place de [Amount]. Voilà la
requête corrigée.


alter table T add Quarter tinyint
update T set
Quarter = (
select count(*) from T T2
where T2.Year = T.Year
and T2.Amount <= T.Amount
)

En effet, la requête de Christophe calcule la même
chose. Ça met au Quarter 1 le Amount le plus petit
de l'année - au Quarter 2, le Amount qui le suit en
ordre croissant, etc.

A partir de

Year Amount
---- ------
1990 3.2
1990 3.1
1990 4.0
1990 2.9

cette requête donnera

Year Amount Quarter
---- ------ -------
1990 3.2 3
1990 3.1 2
1990 4.0 4
1990 2.9 1

SK



Steve Kass wrote:

Jay,

Il est tout-à-fait possible que la requête

SELECT * FROM T
ORDER BY Year

executée aujourd'hui donnera

Year Amount
---- ------
1990 1.1
1990 1.2
1990 1.3
1990 1.4
1991 2.1
1991 2.2
1991 2.3
1991 2.4
1992 4.2
1993 5.1
1993 5.2

mais executée demain donnera

Year Amount
---- ------
1990 1.3
1990 1.2
1990 1.1
1990 1.4
1991 2.2
1991 2.3
1991 2.1
1991 2.3
1991 2.4
1992 4.2
1993 5.2
1993 5.1


Les rangées d'une table n'ont pas une ordre
propre - par contre ce sont comme des billes
dans un sac, et elles ne se rangent en ordre qu'au
moment de sélection.

Je vois deux possibilités:

1. Dans cet exemple, les valeurs [Amount] se présentent
en ordre croissant. Si vous croyez que la valeur de
"Quarter 1" est toujours la valeur la plus petite
d'une année, Quarter 2 est la plus petite des restes, etc.,

alter table T add Quarter tinyint
update T set
Quarter = (
select count(*) from T T2
where T2.Year = T.Year
and T2.Year <= T.Year
)

Au cas de duplication d'une valeur Amount, vous
trouverez des répétitions dans la colonne Quarter.


2. On peut espérer (sans garantie) que l'on peut
insérer les rangées dans une table temporaire
dans l'ordre voulue avec une colonne unique:

select identity(int, 1, 1) as pk, Year, Amount, cast(1 as tinyint) as
Quarter
into #T from T
go

update #T set
Quarter = (
select count(*) from #T T2
where T2.Year = #T.Year
and T2.pk <= #T.pk
)
go

truncate table T
alter table T add Quarter tinyint
insert into T select Year, Amount, Quarter from #T

SK





Sans pouvoir identifier une propriété

La sequence de présentation de vos rangées dans le
resultat de SELECT * FROM T n'est pas une propriété de la rangée,
et il n'y a aucune garantie que cette ordre sera toujours
la même, sans ajouter ORDER BY <expression>

que la requête présentent les données
dans une certaine ordre, il est impossible de

Le problème est que

Jay Mathieu wrote:

en fait, il n'y a pas de règle, faut seulement que la première fois
que l'on
voi l'année 1990, on mette 1, la 2ième fois on met 2, la 3ième fois
... 3
.... et quelque soit la valeur du Amount


"Steve Kass" wrote in message
news:


Jay,

Ta table a 4 rangées dont l'année est 1990, et il ne me
semble pas possible de determiner laquelle correspond au
quarter 1, laquelle au quarter 2, etc. Pourriez-vous donnez
un regle pour décider le quarter à partir des valeurs d'une
rangée?

-- Steve Kass
-- Drew University
-- Ref: E285A187-E263-4CCE-BA42-2AE0DAA4533D

Jay Mathieu wrote:



Bonjour tout le monde,

Je suis un peu nouveau dans ce joli monde de SQL, et j'ai un petit






problème


pour vous :

J'ai une table qui ressemble a ca :
Year Amount
---- ------
1990 1.1
1990 1.2
1990 1.3
1990 1.4
1991 2.1
1991 2.2
1991 2.3
1991 2.4
1992 4.2
1993 5.1
1993 5.2

Et je veux que ca me donne ca :
Year Quarter Amount
---- ------- ------
1990 1 1.1
1990 2 1.2
1990 3 1.3
1990 4 1.4
1991 1 2.1
1991 2 2.2
1991 3 2.3
1991 4 2.4
1992 1 4.2
1993 1 5.1
1993 2 5.2

Est-ce possible avec un Select ????
En gros, le but du jeu est de calculer le nombre de fois qu'une meme






année


est apparue.

Merci Beaucoup !!

Mathieu.