2009-10-19 6 views
3

Est-il possible de raccourcir un groupe par clause afin que vous ne devez pas répéter les champs mentionnés dans la clause select ad nauseam? Par exemple:GROUP Raccourcissement par la clause

SELECT 
    field1, 
    field2, 
    field3, 
    field4 
FROM table 
GROUP BY 
    field1, 
    field2, 
    field3, 
    field4 

to: 

SELECT 
field1, 
field2, 
field3, 
field4 
FROM table 
GROUP BY 
SELECT.* 

... ou quelque chose à cet effet. J'écris une requête qui utilisera la procédure stockée sp_executesql() et je manque d'espace disponible dans ma variable. Merci beaucoup.

Répondre

11

vous recherchez SELECT DISTINCT ou SELECT DISTINCTROW?

+1

Crud. Ouais, avait un brainfart là-bas. Complètement oublié à propos de distinct. Merci. – DaWolfman

+0

J'ai rejeté, puis réalisé que DISTINCT a répondu à la question qu'il a effectivement posée. Pardon. –

8
SELECT 
    field1, 
    field2, 
    field3, 
    field4 
FROM table 
GROUP BY 1,2,3,4 

Lorsque les chiffres représentent la position de colonne dans une partie sélectionnée.

+0

+1 - Excellente idée de raccourci! –

+0

Je ne savais pas à ce sujet. Merci pour le conseil! – DaWolfman

+0

nice one :) appris quelque chose de nouveau aujourd'hui – knittl

0

Ils sont 2 concepts différents:

  • SELECT = sortie
  • GROUP BY = quoi agréger sur

Maintenant, chaque entrée SELECT doivent être agrégées ou dans le GROUP BY. Souvent, le GROUP BY a également plus de colonnes que le SELECT.

Cependant, je pense que vous l'agrégation trop/trop tard. Vous pouvez utiliser des tables dérivées ou CTE pour faire les choses "plus tôt".

SELECT 
    T1.field1, T1.field2, foo.field3, foo.field4, foo.AggField5 
FROM 
    table T1 
    JOIN 
    (SELECT 
     T2.keycol, T2.field3, T2.field4, SUM(T2.field5) AS AggField5 
    FROM 
     table T2 
    GROUP BY 
     T2.keycolT2.field3, T2.field4 
    ) foo ON T1.Keycol = foo.keycol 

Dans votre exemple, si, utilisez DISTINCT sans GROUP BY ...

1

Il y a une différence significative entre PAR GROUPE DISTINCT et. Dans les requêtes simples, elles peuvent être identiques, bien que, bien sûr, GROUP BY permette des agrégats.

Mais aussi bien que cela, DISTINCT ne fonctionnera sur tous les domaines avant de faire le DISTINCT, même si elles sont des utilisations déterministes du même domaine (par exemple, la date de début et DATEADD (jour, 1, StartDate) - vérifier l'exécution Planifiez, vous verrez que le DATEADD est fait AVANT le DISTINCT Donc, GROUP BY est presque toujours meilleur

Mais ... il faut garder à l'esprit que dès que GROUP BY inclut quelque chose qui a un index unique sur elle (comme la clé primaire), tous les autres éléments de cette table sont ignorés. Après tout, vous ne pouvez pas obtenir plus unique en incluant d'autres domaines dans la clause GROUP BY.

Alors pourquoi ne pas adopter une approche de:

GROUP BY t.id, u.id 
/* All these other fields are ignored but here because they're 
    in the HAVING/SELECT/ORDER BY clauses 
*/ 
, t.TransactionValue, u.Username, .... 

Je reçois que vous êtes toujours avoir à taper tout ça, et il serait agréable d'avoir GROUP BY t.*, mais si vous voulez, vous pouvez laisser Microsoft savoir par le vote à https://connect.microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=124654

Questions connexes