Je construis un rapport à l'aide d'un paramètre stocké SQL que j'ai créé. Il extrait des données qui peuvent avoir 1 ligne par numéro unique ou 2 lignes par numéro unique. Je souhaite n'afficher que les lignes où il n'y a qu'une seule ligne.
J'ai essayé de modifier la visibilité, mais le plus proche auquel je suis arrivé est
LastRxNo Reorders1LastRxNo Rxs2RxBatch Duplicate 111 111 null 0 222 222 null 0 222 444 CF 1
mais cela masque 1 des les lignes, et pas les deux. J'ai également essayé d'utiliser CASE WHEN dans la requête pour identifier s'il y a plus d'une ligne, mais je n'ai toujours pas pu me cacher lorsqu'il y a plus d'une ligne. Ma requête est ci-dessous (expurgé quelques lignes de critères supplémentaires qui ne sont pas pertinents pour ma question ici. Il existe de nombreux cas où la première partie de mon instruction WHERE contiendra des données qui répondent également aux critères de la deuxième partie.
SELECT Reorders.LastRxNo, Reorders_1.LastRxNo AS Reorders1LastRxNo, Rxs_2.RxBatch AS Rxs2RxBatch, Reorders.FacID, KeyIdentifiers.GPI, Reorders.LastFillDt, Rxs_1.RxBatch as Rxs1RxBatch, CASE WHEN (Reorders.LastRxNo<>Reorders_1.LastRxNo) THEN 1 ELSE 0 END AS Duplicate FROM Reorders LEFT OUTER JOIN Rxs AS Rxs_1 ON Reorders.LastRXNo = Rxs_1.RxNo RIGHT OUTER JOIN KeyIdentifiers ON Reorders.NDC = KeyIdentifiers.NDC INNER JOIN Patients ON Reorders.FacID = Patients.FacID AND Reorders.PatID = Patients.PatID LEFT OUTER JOIN Reorders AS Reorders_1 ON Reorders.FacID = Reorders_1.FacID AND Reorders.PatID = Reorders_1.PatID AND KeyIdentifiers.NDC = Reorders_1.NDC LEFT OUTER JOIN Rxs AS Rxs_2 ON Reorders_1.LastRxNo = Rxs_2.RxNo WHERE Reorders.ProfileOnly = 1 AND Rxs_1.RxBatch IS NULL AND Reorders.CutOffDt IS NULL AND Reorders.PackType LIKE 'PHDEF%' AND Reorders.Auto = 1 AND Reorders.PhRxStatus IS NULL AND Reorders.LastFillDt > '01/01/2019' AND (Reorders.LastRxNo = Reorders_1.LastRxNo OR Reorders.LastRxNo <> Reorders_1.LastRxNo AND Rxs_2.RxBatch IN ('CF','GONE')) ORDER BY Reorders.FacID, Patients.PatLName, Patients.PatFName
Rend des résultats similaires à:
=IIF(Fields!uniquenumber.Value = previous(Fields!uniquenumber.value,True,False)
Dans l'exemple ci-dessus, je n'ai besoin que de voir les lignes comme la ligne 1 . Comme "LastRxNo" 222 comporte 2 lignes, je ne veux pas le voir sur mon rapport final. (Cependant, il est interrogé, car lorsque LastRxNo = 222 AND Reorders1LastRxNo = 222 et Rxs2RxBatch IS NULL tirerait si je ne tenais pas compte pour cela dans ma déclaration WHERE, je pense. Je suis heureux de faire cela de toutes les manières possibles, que ce soit dans la requête ou dans le rapport SSRS.
3 Réponses :
Filtrez simplement toutes les lignes où le nombre de lignes est supérieur à 1:
SELECT Reorders.LastRxNo FROM Reorders INNER JOIN ( SELECT LastRxNo FROM Reorders GROUP BY LastRxNo HAVING COUNT(LastRxNo) = 1 ) AS UniqueRxNo ON UniqueRxNo.LastRxNo = Reorders.LastRxNo
Vous devriez simplement pouvoir ajouter les deux dernières lignes dans votre clause WHERE.
Vous pouvez également l'ajouter à vos conditions JOIN:
SELECT LastRxNo, RxBatch FROM Reorders WHERE RxBatch IN ('CF','GONE') AND Reorders.LastRxNo IN (SELECT LastRxNo FROM Reorders GROUP BY LastRxNo HAVING COUNT(LastRxNo) = 1)
J'ai ajouté ceci, mais cela n'a apporté aucun changement à mes résultats. J'ai changé le code ci-dessus, peut aider à montrer pourquoi cela ne fonctionnerait pas?
Vous devriez juste pouvoir ajouter les deux dernières lignes dans votre clause WHERE et cela fonctionnera. Vous pouvez également le mettre dans vos conditions JOIN telles que modifiées ci-dessus.
Oui, vous pouvez le faire de deux manières:
Je ne comprends pas pourquoi, mais lorsque j'ajoute "DISTINCT" à l'instruction Select (For LastRxNo), j'obtiens toujours les mêmes résultats que mes rendements dans le message d'origine. Et Masquer les doublons ne fonctionne pas, car il ne masque que le doublon, pas la première ligne, également. Je veux cacher les deux lignes.
Vous sélectionnez évidemment plus de colonnes que vous n'en affichez sur le rapport. Affichez l'ensemble de données complet ou effectuez une sélection distincte et supprimez la colonne qui n'est pas un doublon.
DISTINCT ne fonctionnera pas pour ce cas d'utilisation - DISTINCT affiche une ligne lorsqu'il y a des doublons alors que OP veut afficher uniquement les lignes qui n'ont pas de doublons. La même chose s'applique à "Masquer les doublons"
Remplacez votre cas ... comme dupliquer avec alors p> envelopper la requête entière dans une autre sélection comme ceci ... p> SELECT * FROM
(
your original query here including the change stated above
) q
WHERE q.LastRxNoCount =1
Cela a fonctionné exactement comme je le voulais. Merci beaucoup!
En l'état, cette requête semble invalide. L'alias de table
Reorders_1
est utilisé dans la requête mais n'est pas défini. Même problème pourRxs_2
. Est-ce vraiment la requête que vous utilisez?J'ajouterais une clause distincte à votre instruction select et modifierais votre clause where et supprimerais "(Reorders.LastRxNo = Reorders_1.LastRxNo OR Reorders.LastRxNo <> Reorders_1.LastRxNo" car ceux-ci s'annulent mutuellement
quelle version de SQL utilisez-vous?
@GMB ce n'est pas ma requête complète. Comme je l'ai dit dans mon message OG, j'ai expurgé de nombreuses lignes qui n'étaient pas pertinentes pour la question. Ces tables sont présentes dans mes jointures et y sont définies.
@ SuperSimmers44 Eh bien, la clause where que vous voyez n'est pas celle que j'avais à l'origine. GMB a édité mon message original et déplacé quelques parenthèses, ce qui n'est pas ce que j'ai. Ma clause where est (Reorders.LastRxNo = Reorders_1.LastRxNo OR Reorders.LastRxNo <> Reorders_1.LastRxNo AND Rxs_2.RxBatch IN ('CF', 'GONE')) Le déplacement des parenthèses importait dans ce cas, car ils ne s'annulent pas les uns les autres. (J'ai changé ma requête pour revenir à ce que j'avais initialement dans le message d'origine)
@AlanSchofield J'utilise SQL Server 2012
J'ai changé la requête pour inclure le reste (y compris les jointures et plus de parties de la clause WHERE, pour aider à éclairer davantage ce que je saisis.