SQL à l'aide de CAS dans les SÉLECTIONNER avec le GROUPE. Besoin de CAS de la valeur, mais à obtenir de la ligne de la valeur
donc basicially il y a 1 question et 1 problème:
1. question - lorsque j'ai comme 100 colonnes dans une table(et pas de clé ou de uindex est réglé) et je veux rejoindre ou sous-sélection de la table avec elle-même, dois-je vraiment écrire chaque nom de colonne?
2. problème - l'exemple ci-dessous montre l'1. question et mon instruction SQL problème
Exemple:
A.FIELD1,
(SELECT CASE WHEN B.FIELD2 = 1 THEN B.FIELD3 ELSE null FROM TABLE B WHERE A.* = B.*) AS CASEFIELD1
(SELECT CASE WHEN B.FIELD2 = 2 THEN B.FIELD4 ELSE null FROM TABLE B WHERE A.* = B.*) AS CASEFIELD2
FROM TABLE A
GROUP BY A.FIELD1
L'histoire est la suivante: si je ne mets pas le CAS dans sa propre instruction select, alors je dois mettre le réel rowname dans le GROUP BY et GROUP BY n'est pas le groupe le NUL de la valeur de l'AFFAIRE, mais la valeur réelle de la ligne. Et parce que des que j'aurais à le rejoindre ou sous-sélection avec toutes les colonnes, car il n'y a pas de clé et pas uindex, ou trouver une autre solution.
DBServer DB2.
Donc maintenant à décrire seulement avec des mots et pas de SQL:
J'ai "éléments de commande", qui peut être divisé en "ZD" et "EK" (1 = ZD, 2 = EK) et peuvent être regroupées par "distributeur". Même si "les éléments de commande" peut avoir l'une des deux différents "départements"(ZD, EK), les champs/lignes pour "ZD" et "EK" sont toujours remplis. J'ai besoin de le regroupement de considérer le "département" et que si le désigné "le département" (ZD ou EK) est en train de changer, alors je veux un nouveau groupe à créer.
SELECT
(CASE WHEN TABLE.DEPARTEMENT = 1 THEN TABLE.ZD ELSE null END) AS ZD,
(CASE WHEN TABLE.DEPARTEMENT = 2 THEN TABLE.EK ELSE null END) AS EK,
TABLE.DISTRIBUTOR,
sum(TABLE.SOMETHING) AS SOMETHING,
FROM TABLE
GROUP BY
ZD
EK
TABLE.DISTRIBUTOR
TABLE.DEPARTEMENT
Ici travaillé dans le SÉLECTIONNER et ZD, EK dans le GROUPE. Le seul problème était, même si EK n'a pas été désigné le DEPARTEMENT, elle est encore ouvert un nouveau groupe si ça a changé, parce qu'il était à l'aide de la réelle EK valeur et non NULLE d'être le CAS, comme j'étais déjà en expliquant haut.
Exactement, mais c'est juste la question de bien et de ne pas le vrai problème, que je vais essayer de plus/mieux expliquer dans les heures à venir.
OriginalL'auteur Khazar | 2013-07-31
Vous devez vous connecter pour publier un commentaire.
Et voici, mesdames et messieurs, est la solution au problème:
@t-clausen.dk: je vous Remercie!
@les autres: ...
OriginalL'auteur Khazar
En fait il y a un générique de test d'égalité.
Je ne suis pas sûr pourquoi vous groupe par champ1, qui semble impossible dans votre exemple. J'ai essayé de l'insérer dans votre question:
Cela ne fonctionne pas pour les types de données qui ne sont pas comparables
oui, c'est très complexe. Mais je voulais juste démontrer qu'il était possible
OriginalL'auteur t-clausen.dk
Non, il n'y a pas de générique de test d'égalité. Vous auriez à la liste de tous les champs que vous souhaitez tester individuellement. Si vous ne voulez pas tester chaque champ, vous pouvez utiliser un hack comme la concaténation de tous les domaines, comme par exemple
mais de toute façon, vous avez une liste de tous les champs.
'a' || null || 'c'
et'a' || 'b' || null
permettra à la fois de retourner la valeur NULL, alors que l'intention, évidemment, serait de traiter ces combinaisons différentes. D'autre part, une valeur NULL n'est pas égale à une autre valeur NULL, alors'a' || null || 'c'
et'a' || null || 'c'
ne sera pas égale, bien que l'intention dans ce cas serait de les traiter comme des égaux.S'il vous plaît aller à crier, les normes SQL corps et de leur dire de s'installer sur une norme de l'opérateur, puis...
S'il vous plaît aller crier à qui vous voulez vous-même. La norme SQL ANSI, spécifie clairement la double barre verticale comme l'opérateur de concaténation.
Si une question est balisé pour un SGBD, alors ne pensez-vous pas que la réponse devrait être approprié pour l'environnement? Une base de données mySQL réponse pourrait être inapproprié sous SQL Server. Un T-SQL réponse peut être déplacée sous DB2. Personnellement, si ce qui suggère une réponse pour un système, je suis pas familier avec, j'essaie de vérifier la référence de votre choix si j'ai le temps. Et je comprend généralement une mise en garde que mon expérience est principalement sur l' ___. Ceci donne aux lecteurs une tête à être un peu plus prudent en prenant ma réponse mot à mot, pour vérifier les détails, et nous espérons être plus indulgent dans une critique.
OriginalL'auteur Marc B
Je peut avoir tendance à le résoudre quelque chose comme cela
OriginalL'auteur WarrenT
Si vous avez besoin de trouver toutes les lignes dans TableA qui correspondent à la TableB, se CROISENT ou se CROISENT DISTINCTES?
Toutefois, si vous ne souhaitez que des lignes à partir d'Un endroit où l'ensemble de la ligne en adéquation avec les valeurs dans une ligne de B, alors pourquoi est-ce que votre code d'exemple prendre certaines valeurs de A et d'autres à partir de B? Si la ligne correspond à toutes les colonnes, puis qui semblent inutiles. (Peut-être que votre question pourrait être expliqué un peu plus pleinement?)
Veuillez expliquer l'exigence(s) en anglais, y compris (mais non limité à) ce que vous devez faire avec le CAS de la logique, et la logique de correspondance. Laissez le SQL pour l'instant. On peut prévoir que, une fois que nous avons clairement et sans ambiguïté de comprendre exactement ce qui doit être fait,
Désolé, je ne sais pas pourquoi je n'ai pas vu votre réponse, tout en donnant à la mienne.
C'est l'explication compréhensible, dans la façon dont je l'ai écrit?
Oui, je le crois. Il semble que vous êtes passé le point de lui demander sur une.*=b.*, - il correct? Il ressemble à votre SQL est maintenant aborder une bonne solution, hein? Du bon travail. Je vais ajouter comment je le ferai bientôt.
OriginalL'auteur WarrenT