0
votes

Est-il possible de masquer toutes les lignes de données dupliquées?

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.


7 commentaires

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 pour Rxs_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.


3 Réponses :


0
votes

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)


2 commentaires

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.



-1
votes

Oui, vous pouvez le faire de deux manières:

  1. se trouve dans votre source de données, effectuez une sélection distincte.
  2. Définissez la propriété "Masquer les doublons" sur la ligne de détail dans les propriétés du rapport

3 commentaires

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"



1
votes

Remplacez votre cas ... comme dupliquer avec xxx pré>

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


1 commentaires

Cela a fonctionné exactement comme je le voulais. Merci beaucoup!