OVH Cloud OVH Cloud

Question de logique

6 réponses
Avatar
David
Bonjour,

Je m'arrache les cheveux depuis 1 journée sur une requête tout simple de
prime abord
A l'aide de l'instruction CUBE, j'obtiens plusieurs sous total pour chaque
catégorie.

Ma table d'origine contient ceci:
A B C D
================
1 a 100 50
1 e 10 10
2 r 5 8
2 f 5 6
3 t 10 7

Apres la requete utilisant le CUBE
SELECT
A, B, sum(C) as C, sum(D) as D
INTO #T0
FROM
tbl
GROUP BY
A, B WITH CUBE

,j'obtiens ceci:
A B C D
================
1 a 100 50
1 e 10 10
1 null 110 60
2 r 5 8
2 f 5 6
2 null 10 14
3 t 10 7
3 null 10 7
null null 130 81
null a 100 50
null e 10 10
null r 5 8
null f 5 6
null t 10 7


C'est à partir de maintenant que le problème se pose, je voudrais supprimer
les lignes répondant au critere suivant:
(A is null) AND (B is not null)
Donc, je dois garder le contraire de cette expression, ce qui me donne:
NOT ((A is null) AND (B is not null)) <=> (A is not null) or (B is null)
Voici la requete:
SELECT
*
FROM
#T0
WHERE
(A is not null) or (B is null)

Voici le résultat:
A B C D
================
1 a 100 50
1 e 10 10
1 null 110 60
2 r 5 8
2 f 5 6
2 null 10 14
3 t 10 7
3 null 10 7

Problème, il me manque la ligne suivante:
null null 130 81

que je veux conserver dans mon résultat final

SI QUELQU'UN POUVAIT M'AIDER, MERCI !!!

6 réponses

Avatar
Patrice
Etrange...

Si tu fais un simple SELECT de la table #T0 la ligne null, null, 130, 81
est-elle présente ?

Si tu crées une table de test avec la même ligne et que tu appliques ce
where est-ce que cela marche ?

Pour l'instant je dirais plutôt que la ligne est virée avant...

Patrice

--

"David" a écrit dans le message de
news:
Bonjour,

Je m'arrache les cheveux depuis 1 journée sur une requête tout simple de
prime abord
A l'aide de l'instruction CUBE, j'obtiens plusieurs sous total pour chaque
catégorie.

Ma table d'origine contient ceci:
A B C D
=============== > 1 a 100 50
1 e 10 10
2 r 5 8
2 f 5 6
3 t 10 7

Apres la requete utilisant le CUBE
SELECT
A, B, sum(C) as C, sum(D) as D
INTO #T0
FROM
tbl
GROUP BY
A, B WITH CUBE

,j'obtiens ceci:
A B C D
=============== > 1 a 100 50
1 e 10 10
1 null 110 60
2 r 5 8
2 f 5 6
2 null 10 14
3 t 10 7
3 null 10 7
null null 130 81
null a 100 50
null e 10 10
null r 5 8
null f 5 6
null t 10 7


C'est à partir de maintenant que le problème se pose, je voudrais


supprimer
les lignes répondant au critere suivant:
(A is null) AND (B is not null)
Donc, je dois garder le contraire de cette expression, ce qui me donne:
NOT ((A is null) AND (B is not null)) <=> (A is not null) or (B is null)
Voici la requete:
SELECT
*
FROM
#T0
WHERE
(A is not null) or (B is null)

Voici le résultat:
A B C D
=============== > 1 a 100 50
1 e 10 10
1 null 110 60
2 r 5 8
2 f 5 6
2 null 10 14
3 t 10 7
3 null 10 7

Problème, il me manque la ligne suivante:
null null 130 81

que je veux conserver dans mon résultat final

SI QUELQU'UN POUVAIT M'AIDER, MERCI !!!










Avatar
Laurent
Je viens de faire le test
-1) les données de ma table
A B C D
----------- ---- ----------- -----------
1 a 100 50
1 e 10 10
2 r 5 8
2 f 5 6
3 t 10 7
(5 ligne(s) affectée(s))


-2) création de la table temp
SELECT
A, B, sum(C) as C, sum(D) as D
INTO #T0
FROM
tbl
GROUP BY
A, B WITH CUBE
donne,

A B C D
----------- ---- ----------- -----------
1 a 100 50
1 e 10 10
1 NULL 110 60
2 f 5 6
2 r 5 8
2 NULL 10 14
3 t 10 7
3 NULL 10 7
NULL NULL 130 81
NULL a 100 50
NULL e 10 10
NULL f 5 6
NULL r 5 8
NULL t 10 7

(14 ligne(s) affectée(s))

et enfin

la clause where :
A B C D
----------- ---- ----------- -----------
1 a 100 50
1 e 10 10
1 NULL 110 60
2 f 5 6
2 r 5 8
2 NULL 10 14
3 t 10 7
3 NULL 10 7
NULL NULL 130 81

(9 ligne(s) affectée(s))

et j'obtiens la ligne null null 130 81,
pour info je suis en SQL SERVER 2000 sp3a
Peux être a t-u des paramètres serveur modifié notamment sur les comparaison
avec null.

"David" a écrit :

Bonjour,

Je m'arrache les cheveux depuis 1 journée sur une requête tout simple de
prime abord
A l'aide de l'instruction CUBE, j'obtiens plusieurs sous total pour chaque
catégorie.

Ma table d'origine contient ceci:
A B C D
=============== > 1 a 100 50
1 e 10 10
2 r 5 8
2 f 5 6
3 t 10 7

Apres la requete utilisant le CUBE
SELECT
A, B, sum(C) as C, sum(D) as D
INTO #T0
FROM
tbl
GROUP BY
A, B WITH CUBE

,j'obtiens ceci:
A B C D
=============== > 1 a 100 50
1 e 10 10
1 null 110 60
2 r 5 8
2 f 5 6
2 null 10 14
3 t 10 7
3 null 10 7
null null 130 81
null a 100 50
null e 10 10
null r 5 8
null f 5 6
null t 10 7


C'est à partir de maintenant que le problème se pose, je voudrais supprimer
les lignes répondant au critere suivant:
(A is null) AND (B is not null)
Donc, je dois garder le contraire de cette expression, ce qui me donne:
NOT ((A is null) AND (B is not null)) <=> (A is not null) or (B is null)
Voici la requete:
SELECT
*
FROM
#T0
WHERE
(A is not null) or (B is null)

Voici le résultat:
A B C D
=============== > 1 a 100 50
1 e 10 10
1 null 110 60
2 r 5 8
2 f 5 6
2 null 10 14
3 t 10 7
3 null 10 7

Problème, il me manque la ligne suivante:
null null 130 81

que je veux conserver dans mon résultat final

SI QUELQU'UN POUVAIT M'AIDER, MERCI !!!











Avatar
David
Ravi de l'apprendre que chez toi ca marche. Malheuresement pour moi cela ne
marche pas.
lol

".....Peux être a t-u des paramètres serveur modifié notamment sur les
comparaison avec null....."



Comment peut on savoir ca ?


"Laurent" a écrit dans le message de
news:
Je viens de faire le test
-1) les données de ma table
A B C D
----------- ---- ----------- -----------
1 a 100 50
1 e 10 10
2 r 5 8
2 f 5 6
3 t 10 7
(5 ligne(s) affectée(s))


-2) création de la table temp
SELECT
A, B, sum(C) as C, sum(D) as D
INTO #T0
FROM
tbl
GROUP BY
A, B WITH CUBE
donne,

A B C D
----------- ---- ----------- -----------
1 a 100 50
1 e 10 10
1 NULL 110 60
2 f 5 6
2 r 5 8
2 NULL 10 14
3 t 10 7
3 NULL 10 7
NULL NULL 130 81
NULL a 100 50
NULL e 10 10
NULL f 5 6
NULL r 5 8
NULL t 10 7

(14 ligne(s) affectée(s))

et enfin

la clause where :
A B C D
----------- ---- ----------- -----------
1 a 100 50
1 e 10 10
1 NULL 110 60
2 f 5 6
2 r 5 8
2 NULL 10 14
3 t 10 7
3 NULL 10 7
NULL NULL 130 81

(9 ligne(s) affectée(s))

et j'obtiens la ligne null null 130 81,
pour info je suis en SQL SERVER 2000 sp3a
Peux être a t-u des paramètres serveur modifié notamment sur les
comparaison
avec null.

"David" a écrit :

Bonjour,

Je m'arrache les cheveux depuis 1 journée sur une requête tout simple de
prime abord
A l'aide de l'instruction CUBE, j'obtiens plusieurs sous total pour
chaque
catégorie.

Ma table d'origine contient ceci:
A B C D
=============== >> 1 a 100 50
1 e 10 10
2 r 5 8
2 f 5 6
3 t 10 7

Apres la requete utilisant le CUBE
SELECT
A, B, sum(C) as C, sum(D) as D
INTO #T0
FROM
tbl
GROUP BY
A, B WITH CUBE

,j'obtiens ceci:
A B C D
=============== >> 1 a 100 50
1 e 10 10
1 null 110 60
2 r 5 8
2 f 5 6
2 null 10 14
3 t 10 7
3 null 10 7
null null 130 81
null a 100 50
null e 10 10
null r 5 8
null f 5 6
null t 10 7


C'est à partir de maintenant que le problème se pose, je voudrais
supprimer
les lignes répondant au critere suivant:
(A is null) AND (B is not null)
Donc, je dois garder le contraire de cette expression, ce qui me donne:
NOT ((A is null) AND (B is not null)) <=> (A is not null) or (B is null)
Voici la requete:
SELECT
*
FROM
#T0
WHERE
(A is not null) or (B is null)

Voici le résultat:
A B C D
=============== >> 1 a 100 50
1 e 10 10
1 null 110 60
2 r 5 8
2 f 5 6
2 null 10 14
3 t 10 7
3 null 10 7

Problème, il me manque la ligne suivante:
null null 130 81

que je veux conserver dans mon résultat final

SI QUELQU'UN POUVAIT M'AIDER, MERCI !!!













Avatar
Steve Kass
David,

Est-il possible que votre requête a d'autre éléments, comme

WHERE (A is not null) or (B is null)
and [exp1] or [exp2] ?

L'operateur AND a une précédence plus haute que OR, donc
cette expression équivalerait à

(A is not null)
or ( (B is null) and [exp1] )
or [exp2]

Steve Kass
Drew University



David wrote:

Bonjour,

Je m'arrache les cheveux depuis 1 journée sur une requête tout simple de
prime abord
A l'aide de l'instruction CUBE, j'obtiens plusieurs sous total pour chaque
catégorie.

Ma table d'origine contient ceci:
A B C D
=============== >1 a 100 50
1 e 10 10
2 r 5 8
2 f 5 6
3 t 10 7

Apres la requete utilisant le CUBE
SELECT
A, B, sum(C) as C, sum(D) as D
INTO #T0
FROM
tbl
GROUP BY
A, B WITH CUBE

,j'obtiens ceci:
A B C D
=============== >1 a 100 50
1 e 10 10
1 null 110 60
2 r 5 8
2 f 5 6
2 null 10 14
3 t 10 7
3 null 10 7
null null 130 81
null a 100 50
null e 10 10
null r 5 8
null f 5 6
null t 10 7


C'est à partir de maintenant que le problème se pose, je voudrais supprimer
les lignes répondant au critere suivant:
(A is null) AND (B is not null)
Donc, je dois garder le contraire de cette expression, ce qui me donne:
NOT ((A is null) AND (B is not null)) <=> (A is not null) or (B is null)
Voici la requete:
SELECT
*
FROM
#T0
WHERE
(A is not null) or (B is null)

Voici le résultat:
A B C D
=============== >1 a 100 50
1 e 10 10
1 null 110 60
2 r 5 8
2 f 5 6
2 null 10 14
3 t 10 7
3 null 10 7

Problème, il me manque la ligne suivante:
null null 130 81

que je veux conserver dans mon résultat final

SI QUELQU'UN POUVAIT M'AIDER, MERCI !!!












Avatar
Evariste
Salut,

Ce que je voulais dire en montrant que ca marchait, c'est qu'a priori, y a
rien à changer aux requetes.
les test ont été fait sur une machine en XP PRO SP2 / SQL2K SP3a / avec a
priori les options par défaut au niveau de la base.
Il y a un paramètre au niveau de la base qui ANSI NULL
Tu peux le modififer avant de lancer la requete
SET Ansi_Nulls {on | off}
J'ai fait des tests, mais je n'arrive pas à reproduire ton erreur.
Peux tu mettre le script de création de table , dans mon test, j'ai mis les
valeurs numériques en int et la lettre ne nvarchar(1), peux tu indiquer
également la platteforme, et le classement au niveau table.


"David" a écrit :

Ravi de l'apprendre que chez toi ca marche. Malheuresement pour moi cela ne
marche pas.
lol

> ".....Peux être a t-u des paramètres serveur modifié notamment sur les
> comparaison avec null....."

Comment peut on savoir ca ?


"Laurent" a écrit dans le message de
news:
> Je viens de faire le test
> -1) les données de ma table
> A B C D
> ----------- ---- ----------- -----------
> 1 a 100 50
> 1 e 10 10
> 2 r 5 8
> 2 f 5 6
> 3 t 10 7
> (5 ligne(s) affectée(s))
>
>
> -2) création de la table temp
> SELECT
> A, B, sum(C) as C, sum(D) as D
> INTO #T0
> FROM
> tbl
> GROUP BY
> A, B WITH CUBE
> donne,
>
> A B C D
> ----------- ---- ----------- -----------
> 1 a 100 50
> 1 e 10 10
> 1 NULL 110 60
> 2 f 5 6
> 2 r 5 8
> 2 NULL 10 14
> 3 t 10 7
> 3 NULL 10 7
> NULL NULL 130 81
> NULL a 100 50
> NULL e 10 10
> NULL f 5 6
> NULL r 5 8
> NULL t 10 7
>
> (14 ligne(s) affectée(s))
>
> et enfin
>
> la clause where :
> A B C D
> ----------- ---- ----------- -----------
> 1 a 100 50
> 1 e 10 10
> 1 NULL 110 60
> 2 f 5 6
> 2 r 5 8
> 2 NULL 10 14
> 3 t 10 7
> 3 NULL 10 7
> NULL NULL 130 81
>
> (9 ligne(s) affectée(s))
>
> et j'obtiens la ligne null null 130 81,
> pour info je suis en SQL SERVER 2000 sp3a
> Peux être a t-u des paramètres serveur modifié notamment sur les
> comparaison
> avec null.
>
> "David" a écrit :
>
>> Bonjour,
>>
>> Je m'arrache les cheveux depuis 1 journée sur une requête tout simple de
>> prime abord
>> A l'aide de l'instruction CUBE, j'obtiens plusieurs sous total pour
>> chaque
>> catégorie.
>>
>> Ma table d'origine contient ceci:
>> A B C D
>> =============== > >> 1 a 100 50
>> 1 e 10 10
>> 2 r 5 8
>> 2 f 5 6
>> 3 t 10 7
>>
>> Apres la requete utilisant le CUBE
>> SELECT
>> A, B, sum(C) as C, sum(D) as D
>> INTO #T0
>> FROM
>> tbl
>> GROUP BY
>> A, B WITH CUBE
>>
>> ,j'obtiens ceci:
>> A B C D
>> =============== > >> 1 a 100 50
>> 1 e 10 10
>> 1 null 110 60
>> 2 r 5 8
>> 2 f 5 6
>> 2 null 10 14
>> 3 t 10 7
>> 3 null 10 7
>> null null 130 81
>> null a 100 50
>> null e 10 10
>> null r 5 8
>> null f 5 6
>> null t 10 7
>>
>>
>> C'est à partir de maintenant que le problème se pose, je voudrais
>> supprimer
>> les lignes répondant au critere suivant:
>> (A is null) AND (B is not null)
>> Donc, je dois garder le contraire de cette expression, ce qui me donne:
>> NOT ((A is null) AND (B is not null)) <=> (A is not null) or (B is null)
>> Voici la requete:
>> SELECT
>> *
>> FROM
>> #T0
>> WHERE
>> (A is not null) or (B is null)
>>
>> Voici le résultat:
>> A B C D
>> =============== > >> 1 a 100 50
>> 1 e 10 10
>> 1 null 110 60
>> 2 r 5 8
>> 2 f 5 6
>> 2 null 10 14
>> 3 t 10 7
>> 3 null 10 7
>>
>> Problème, il me manque la ligne suivante:
>> null null 130 81
>>
>> que je veux conserver dans mon résultat final
>>
>> SI QUELQU'UN POUVAIT M'AIDER, MERCI !!!
>>
>>
>>
>>
>>
>>
>>
>>
>>





Avatar
Jean-Nicolas BERGER
J'ai refait la manip, et il n'y a pas de problème, j'ai bien la fameuse
ligne
null null 130 81
dans mon résultat final.
La syntaxe de la clause Where étant bien avec des 'is Null' et non pas des
'=Null', je ne pense pas que le SET ANSI_NULLS ait un quelconque effet.
Idée en l'air : pourrais-tu placer un SET ROWCOUNT 0 avant l'essai?
A part ça, je ne vois pas...
JN.


"David" a écrit dans le message de news:

Bonjour,

Je m'arrache les cheveux depuis 1 journée sur une requête tout simple de
prime abord
A l'aide de l'instruction CUBE, j'obtiens plusieurs sous total pour chaque
catégorie.

Ma table d'origine contient ceci:
A B C D
=============== > 1 a 100 50
1 e 10 10
2 r 5 8
2 f 5 6
3 t 10 7

Apres la requete utilisant le CUBE
SELECT
A, B, sum(C) as C, sum(D) as D
INTO #T0
FROM
tbl
GROUP BY
A, B WITH CUBE

,j'obtiens ceci:
A B C D
=============== > 1 a 100 50
1 e 10 10
1 null 110 60
2 r 5 8
2 f 5 6
2 null 10 14
3 t 10 7
3 null 10 7
null null 130 81
null a 100 50
null e 10 10
null r 5 8
null f 5 6
null t 10 7


C'est à partir de maintenant que le problème se pose, je voudrais
supprimer les lignes répondant au critere suivant:
(A is null) AND (B is not null)
Donc, je dois garder le contraire de cette expression, ce qui me donne:
NOT ((A is null) AND (B is not null)) <=> (A is not null) or (B is null)
Voici la requete:
SELECT
*
FROM
#T0
WHERE
(A is not null) or (B is null)

Voici le résultat:
A B C D
=============== > 1 a 100 50
1 e 10 10
1 null 110 60
2 r 5 8
2 f 5 6
2 null 10 14
3 t 10 7
3 null 10 7

Problème, il me manque la ligne suivante:
null null 130 81

que je veux conserver dans mon résultat final

SI QUELQU'UN POUVAIT M'AIDER, MERCI !!!