2013-08-27 5 views
0

Je ne suis pas sûr de savoir comment utiliser DISTINCT AB AB. Par exemple, j'ai deux colonnes BoughtLoyaltyProgramId, SoldLoyaltyProgramId. Mais même lorsque j'utilise DISTINCT, il produit un doublon lorsque le même code apparaît dans un programme de fidélisation acheté dans soldloyaltyprogramid. Je ne veux pas de dupes mais je ne sais pas comment cela fonctionne avec plusieurs colonnes et appariements.DISTINCT ne supprime pas les dupes

Voici la procédure stockée:

ALTER PROC AA 
    @LPPProgramID UNIQUEIDENTIFIER , 
    @DateFrom DATETIME , 
    @DateTo DATETIME 
AS 
SELECT DISTINCT TOP (5) 
     BoughtLoyaltyProgramId , 
     SoldLoyaltyProgramId , 
     DateTransactionCleared , 
     ExchangeRate 
FROM dbo.PEX_ClearedTransactions 
WHERE DateTransactionCleared >= @DateFrom 
     AND DateTransactionCleared < @DateTo 
     AND (BoughtLoyaltyProgramId = @LPPProgramID 
       OR SoldLoyaltyProgramId = @LPPProgramID 
      ) 
ORDER BY ExchangeRate; 

GO 
+0

Distinct applique à toutes les colonnes que vous interrogez, pas seulement la première 2. Est-ce qu'il contient encore des doublons si vous considérez toutes les colonnes sélectionnées? –

+1

Pouvez-vous montrer les résultats de la requête? Je ne comprends pas très bien ce qui se passe. – htxryan

+0

Ce n'est pas clair ce que vous demandez. Montrez-nous quelques exemples de données pour vous aider. – RBarryYoung

Répondre

1

Distinct est par rangée, de sorte que la valeur dans les colonnes d'une rangée se trouvent dans une combinaison distincte, les données ne sont pas comparés dans chaque colonne d'une rangée, aux autres colonnes de cette rangée.

Vous voudrez probablement effectuer une comparaison dans votre instruction Where pour les données de colonne.

+0

1. Il contient des doublons si vous considérez toutes les colonnes. Les résultats de la requête montrent un tas d'IDHids achetés, les utilisateurs de Solduserids, l'échange de données, tout ça. Je peux obtenir les résultats exacts si vous voulez. DISTINCT est par ligne, pas par colonne et je ne veux pas avoir de dupes dans toutes les colonnes, mais je ne suis pas encore assez compétent pour savoir comment faire cela. – user2689499

0

Voici comment vous pouvez obtenir toutes les valeurs distinctes de deux colonnes:

SELECT distinct * from 
(SELECT BoughtLoyaltyProgramId 
FROM dbo.PEX_ClearedTransactions 
UNION ALL 
SELECT SoldLoyaltyProgramId 
FROM dbo.PEX_ClearedTransactions) as A 
+0

Dennis, j'ai essayé ça hier et ça n'a pas marché. Toujours montré des dupes. – user2689499

+0

Montrez ce que vous voulez dire par dupes, je suis sûr qu'il ne montrera pas ce que je considère comme des doublons. –

+0

Un ID utilisateur spécifique dans Bought apparaît dans Vendu (parce que vous pouvez être à la fois un acheteur de points de compagnie aérienne et un vendeur). – user2689499

0

Peut-être que vous voulez utiliser ROW_NUMBER:

WITH cte 
    AS (SELECT boughtloyaltyprogramid, 
       soldloyaltyprogramid, 
       datetransactioncleared, 
       exchangerate, 
       RN=Row_number() OVER( 
        partition BY boughtloyaltyprogramid, soldloyaltyprogramid 
        ORDER BY exchangerate) 
     FROM dbo.pex_clearedtransactions 
     WHERE datetransactioncleared >= @DateFrom 
       AND datetransactioncleared < @DateTo 
       AND (boughtloyaltyprogramid = @LPPProgramID 
         OR soldloyaltyprogramid = @LPPProgramID)) 
SELECT TOP(5) * FROM cte 
WHERE RN = 1 
ORDER BY exchangerate 
+0

Tim n'y a-t-il aucun moyen de le faire en tant que procédure stockée? Ça doit être un CTE? – user2689499

+0

@ user2689499: Vous pouvez utiliser un 'CTE' dans une procédure stockée sans problème. C'est comme une sous-requête. –

+0

Tim, je suppose que ce que je demande est pour la syntaxe entière dans la procédure stockée. Où j'ajouterais ce CTE, etc, si vous pouviez m'aider avec ça. – user2689499