2010-07-21 12 views
1

j'ai les données suivantesproblème de colonne Distinct T-SQL en essayant de filtrer les doublons sur

COL-1  COL-2 

1  0TY/OK 
1  0TY/OK 
1  0TY/OK 
1  0TY/OK 
1  0TY/OK 
2  2KP/L   
2  2KP/L 
2  2KP/L 
2  2KP/L  
2  2KP/L  
3  7U5/2M 
3  7U5/2M 
3  7U5/2M 
3  7U5/2M 

Et je veux construire une requête de sélection pour récupérer ces données dans la sortie ci-dessous

COL-1  COL-2  COL-3 

1  0TY/OK  0TY/OK 
1  0TY/OK  2KP/L 
1  0TY/OK  7U5/2M 
1  0TY/OK 
1  0TY/OK 
2  2KP/L   
2  2KP/L 
2  2KP/L 
2  2KP/L  
2  2KP/L  
3  7U5/2M 
3  7U5/2M 
3  7U5/2M 
3  7U5/2M 

Je veux COL3 revenir les valeurs distinctes de COL2

l'utilisation SELECT COL1, COL2, DISTINCT COL2 AS COL3 FROM MYTable ne fonctionne pas SQL Server est

Répondre

1

Bien que je sois certain qu'un assistant SQL sera capable de construire un moyen de faire cela, je ressens le besoin de souligner que cela n'a pas de sens sur le plan conceptuel - les valeurs dans les lignes de la colonne 3 sont complètement indépendantes de les valeurs des lignes dans les colonnes 1 et 2.

Ne pouvez-vous pas simplement renvoyer les valeurs distinctes de COL2 dans une requête distincte?

SELECT DISTINCT COL2 FROM MyTable 

(Notez que vous pouvez renvoyer plusieurs à partir d'une seule resultsets requête SQL)

+0

Je veux utiliser les valeurs distinctes COL3 comme valeurs disponibles pour un paramètre dans mon rapport SSRS 2005. J'aurais pu ajouter une requête séparée, mais malheureusement, je dois le faire dans un jeu de données car les services de reporting SQL Server 2005 n'autorisent pas plusieurs jeux de données dans un seul rapport rdl. Est-il possible d'avoir deux requêtes distinctes dans un seul ensemble de données de rapport SSRS 2005? – StackTrace

+0

@ Name.IsNullOrEmpty - Je vois, je voudrais suggérer une alternative mais je ne suis pas très familier avec SSRS. – Justin

0

Vous pouvez utiliser CTEs pour créer un ROW_NUMBER et JOIN sur ces colonnes virtuelles.

DECLARE @t TABLE (
    Col1 INT 
    ,Col2 VARCHAR(10) 
); 

INSERT INTO @t VALUES (1, '0TY/OK'); 
INSERT INTO @t VALUES (1, '0TY/OK'); 
INSERT INTO @t VALUES (1, '0TY/OK'); 
INSERT INTO @t VALUES (1, '0TY/OK'); 
INSERT INTO @t VALUES (1, '0TY/OK'); 
INSERT INTO @t VALUES (2, '2KP/L,'); 
INSERT INTO @t VALUES (2, '2KP/L'); 
INSERT INTO @t VALUES (2, '2KP/L'); 
INSERT INTO @t VALUES (2, '2KP/L'); 
INSERT INTO @t VALUES (2, '2KP/L'); 
INSERT INTO @t VALUES (3, '7U5/2M'); 
INSERT INTO @t VALUES (3, '7U5/2M'); 
INSERT INTO @t VALUES (3, '7U5/2M'); 
INSERT INTO @t VALUES (3, '7U5/2M'); 

; WITH all_data AS (
    SELECT 
     Col1 
     ,Col2 
     ,ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS RowNum 
    FROM @t 
), 
distinct_data AS (
    SELECT 
     Col2 
     ,ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS RowNum 
    FROM @t 
    GROUP BY 
     Col2 
) 
SELECT 
    all_data.Col1 
    ,all_data.Col2 
    ,distinct_data.Col2 
FROM all_data 
    LEFT JOIN distinct_data ON all_data.RowNum = distinct_data.RowNum 
0

Essayez ceci ..

WITH MyTable AS 
(
    SELECT 1 Col1,CONVERT (VarChar (25), '0TY/OK') Col2 UNION ALL 
    SELECT 1,'0TY/OK' UNION ALL 
    SELECT 1,'0TY/OK' UNION ALL 
    SELECT 1,'0TY/OK' UNION ALL 
    SELECT 1,'0TY/OK' UNION ALL 
    SELECT 2,'2KP/L' UNION ALL 
    SELECT 2,'2KP/L' UNION ALL 
    SELECT 2,'2KP/L' UNION ALL 
    SELECT 2,'2KP/L' UNION ALL 
    SELECT 2,'2KP/L' UNION ALL 
    SELECT 3,'7U5/2M' UNION ALL 
    SELECT 3,'7U5/2M' UNION ALL 
    SELECT 3,'7U5/2M' UNION ALL 
    SELECT 3,'7U5/2M' 
) 
, 
AllData AS 
(
    SELECT 
     *, 
     ROW_NUMBER() OVER (ORDER BY Col2) as Id 
    FROM MyTable 
) 
, 
DistinctData AS 
(
     SELECT 
      Distinct Col2 AS Col3 
     FROM MyTable 
), 
DistinctWithRowNumber AS 
(
    SELECT 
     *, 
     ROW_NUMBER() OVER (ORDER BY Col3) as Id 
    FROM DistinctData 
) 
SELECT 
    Col1, 
    Col2, 
    Col3 
FROM AllData 
    LEFT JOIN DistinctWithRowNumber 
     ON AllData.Id = DistinctWithRowNumber.Id 

renvoie ce résultat

Col1  Col2      Col3 
----------- ------------------------- ------------------------- 
1   0TY/OK     0TY/OK 
1   0TY/OK     2KP/L 
1   0TY/OK     7U5/2M 
1   0TY/OK     NULL 
1   0TY/OK     NULL 
2   2KP/L      NULL 
2   2KP/L      NULL 
2   2KP/L      NULL 
2   2KP/L      NULL 
2   2KP/L      NULL 
3   7U5/2M     NULL 
3   7U5/2M     NULL 
3   7U5/2M     NULL 
3   7U5/2M     NULL 
1

Ceci est vraiment inhabituel, et je ne vois pas pourquoi vous voulez cela dans un jeu de résultats comme n'a aucun sens ... Il n'y a aucune raison d'associer les lignes de la requête distincte avec les lignes de la requête non distincte., mais ce que vous avez à faire est simplement d'exécuter les deux requêtes

Select Col1, Col2 From Table 
Order By Col1, Col2 

Et

Select Distinct Col2 From Table 

et rejoignez-les ensemble (Pour les joindre sur le numéro de ligne, ajouter une fonction ROW_NUMBER() pour chaque requête:

Select Col1, Col2, Col3 
    From (Select Row_Number() Over(Order By Col1, Col2)RowNum, 
       Col1, Col2 
      From Table) T1 
    Left Join 
      (Select Distinct Col2 As Col3, 
      (Select Count(Distinct Col2) 
      From Table 
      Where Col2 <= T2.Col3) RowNum      
      From Table) T2 
     On T2.RowNum = T1.RowNum 
+0

Col3 renvoie toujours des valeurs en double – StackTrace

+0

N'a pas réalisé cela, mais pour une raison quelconque, la fonction Row_Number est hinky avec un distinct dans la requête ... retourné à l'ancienne expression sous-requête de numéro de ligne .... –

+0

Erreur d'obtention "Le multi-partie l'identificateur "T2.Col2" n'a pas pu être lié. " à cette ligne, (Où Col2 <= T2.Col2) ROWNUM) – StackTrace