2017-09-20 5 views
1

J'ai calculé un chiffre quotidien qui rassemble tous les chiffres entrés dans chaque nom, donc j'ai des lignes en double sous chaque nom. Je veux que les résultats montrent seulement un résultat par utilisateur donc j'ai pensé qu'il était préférable d'utiliser distinct. Cependant, j'ai également besoin d'afficher les résultats par chiffre décroissant. Est-ce possible de faire dans la même déclaration?ORDER BY et DISTINCT dans la même instruction select

SELECT DISTINCT 
    D.DATE, 
    COALESCE(M.[Team ADJ],D.[Team ADJ], M.[Name]) AS 'Sales Person', 
    COALESCE(D.[Team], M.[Team]) AS 'Sales Team', 
    isnull(D.[Daily Figure],0) AS [Daily Figure], 

    FROM 
    [Daily] D 
    FULL OUTER JOIN 
    [Month] M ON D.[Name] = F.[Name] 
    ORDER BY [Daily Figure] DESC 

résultats actuels

Date  Sales Person Sales Team  Daily Figure Month 
2017-09-19  FRED   SAM    20   285 
2017-09-19  FRED   SAM    20   285 
2017-09-19  FRED   SAM    20   285 
2017-09-19  TOM   BEN    140   118 
2017-09-19  TOM   BEN    140   118 

ERREUR: 'ORDER BY articles doit apparaître dans la liste de sélection est spécifiée si SELECT DISTINCT.' Même si je l'ai inclus dans la liste de sélection

+0

Pourquoi y a-t-il une colonne 'Date' dans vos résultats alors qu'il n'y en a pas dans votre' SELECT'? Sinon, votre requête devrait fonctionner correctement. –

+0

Si vous vous joignez uniquement par nom, vous obtiendriez, par exemple, 3 enregistrements 'Month' et 90' Daily' un résultat de 270 lignes pour ce seul nom. Est-ce que c'est prévu? S'il vous plaît pensez à ce que vous voulez voir dans vos résultats. Un enregistrement par nom et mois? Un enregistrement par nom et par jour? Un enregistrement par nom? Quelles sont les colonnes 'Date',' Daily Figure' et 'Month' censées contenir? –

+3

"Je veux DISTINCT mais ..." est généralement un indice que vous devriez chercher a) pourquoi vous obtenez des résultats en double et/ou b) si vous avez réellement besoin de "GROUP BY" et agrégats à la place. Pour le moment, je ne sais pas si c'est une situation plus (a) ou (b). –

Répondre

0

La meilleure façon de résoudre ce problème est de commander par la position du numéro de colonne. PAR EXEMPLE. Si la colonne est dans la 4ème position 'commander par 4'

SELECT DISTINCT 
COALESCE(M.[Team ADJ],D.[Team ADJ], M.[Name]) AS 'Sales Person', 
COALESCE(D.[Team], M.[Team]) AS 'Sales Team', 
isnull(D.[Daily Figure],0), 

FROM 
[Daily] D 
FULL OUTER JOIN 
[Month] M ON D.[Name] = F.[Name] 
ORDER BY 4 DESC 
+0

Je déconseille de commander par la colonne ordinal dans le code de production enregistré. Il peut introduire un point d'échec quand quelqu'un modifie le code plus tard. Cependant, je les utilise tout le temps dans les requêtes run-once. –

1

Dans la section order by, vous pouvez référencer la colonne par son alias, par exemple:

select distinct 
    [Date] 
    , coalesce(M.[Team adj],D.[Team adj], M.[Name]) as [Sales Person] 
    , coalesce(D.[Team], M.[Team]) as [Sales Team] 
    , isnull(D.[Daily Figure],0) as [Daily Figure] 
    , [Month] 
from [Daily] D 
    full outer join [Month] M 
    on D.[Name] = F.[Name] 
order by [Daily Figure] desc 


Sans les tables source pour construire la requête, voici une démo en utilisant votre exemple ci-dessus:

select distinct 
    t.Date, 
    [Sales Person], 
    [Sales Team], 
    isnull(t.[Daily Figure],0) AS [Daily Figure] 
from t 
order by [Daily Figure] desc 

rextester démo: http://rextester.com/PVPHSR35614

renvoie:

+------------+--------------+------------+--------------+ 
| Date | Sales Person | Sales Team | Daily Figure | 
+------------+--------------+------------+--------------+ 
| 2017-09-19 | tom   | ben  |   140 | 
| 2017-09-19 | fred   | sam  |   20 | 
+------------+--------------+------------+--------------+ 
+0

error 'Les éléments ORDER BY doivent apparaître dans la liste de sélection si SELECT DISTINCT est spécifié.' Je l'ai inclus dans la liste de sélection –

0

L'exemple de requête n'a pas généré les résultats actuels que vous avez publiés.

Dans un ordre distinct, la colonne de commande doit faire partie du jeu de résultats. Dans votre exemple de requête, il n'y a pas de colonne nommée Daily Figure. Si Daily Figure était utilisé sans expression, la fonction Order By fonctionnerait correctement. Cependant, une fois que vous l'avez enveloppé dans une expression, il ne s'appelle plus Daily Figure.

La solution la plus simple consiste à aliaser la colonne.

, isnull(D.[Daily Figure],0) as [Daily Figure] 

* Mise à jour *

Voici un extrait que vous pouvez exécuter sur un serveur SQL montrant ordre Distinct par l'action.

SELECT DISTINCT 
      t.type_desc, 
      CAST(t.create_date AS DATE) AS Created 
    FROM  sys.tables AS t 
    ORDER BY Created 
; 
+0

J'ai essayé ceci avec un alias mais cela ne fonctionne pas dans le serveur sql –

+0

Mettez à jour l'instruction de requête que vous avez postée dans votre question. Il y a quelque chose qui nous manque. J'ai utilisé Distinct Order By de nombreuses fois. Ses règles sont assez simples. –

+0

C'est le code lol. J'ai utilisé avec l'ordre 3 et cela fonctionne bien –