J'ai ces données:
select id, name, sum(amount), comments from table group by id, name, comments
Chaque nom peut ou non avoir des lignes supplémentaires avec des commentaires nuls ou vides.
Comment puis-je grouper par nom et somme ( montant) de telle sorte qu'il ignore / absorbe les commentaires nuls ou vides dans le regroupement et ne me montre que 2 groupes.
Sortie que je veux:
Id Name sum(amount) Comments ------------------------------------ 1 n1 421762 Hello 2 n2 5180 Bye
I ne peut pas comprendre cela.
J'espérais que cela ignorerait les valeurs nulles / vides mais je me retrouve toujours avec 4 groupes
Id Name amount Comments ------------------------------- 1 n1 421762 Hello 2 n2 421 Bye 3 n2 262 null 4 n2 5127 ''
4 Réponses :
Utilisez simplement MAX ()
avec commentaires
:
select id, name, sum(amount), MAX(comments) from table group by id, name;
utilisez row_number()
select id,name,comments,amount from (select id,name, row_number() over(partition by Name order by case when Comments is not null then 1 else 2 end) rn, sum(amount) over(partition by Name) as amount,comments from table_name ) a where a.rn=1
Ceci ne produit pas le résultat souhaité. Le montant doit être additionné
ID Name Amount Comments 1 n1 421762 Hello 2 n2 5810 Bye
Vous ne pouvez pas avoir de champ dans l'instruction SELECT
à moins qu'il ne fasse partie de la clause GROUP BY ou soit utilisé pour l'agrégation. La question et le résultat souhaité montrent que les lignes doivent être regroupées par nom, ce qui signifie que tous les autres champs (ID, montant, commentaires) doivent être agrégés.
La question ne spécifie pas comment les ID doivent être agrégés, ou quels commentaires doivent apparaître. L'agrégation de chaînes n'est possible qu'à l'aide de fonctions telles que MIN / MAX dans toutes les versions de SQL Server jusqu'en 2016. SQL Server 2017 a ajouté STRING_AGG pour concaténer des chaînes. Dans les versions antérieures, les gens doivent utiliser l'une des nombreuses techniques d'agrégation de chaînes pouvant impliquer des fonctions XML ou SQLCLR.
Dans les versions de SQL Server, la sortie souhaitée peut être produite par
ID name Amount comments 1 n1 421762 Hello 2 n2 5810 Bye
Vous groupez également par commentaires. Si vous ne voulez pas cela, n'ajoutez pas de
commentaires
dans la clausegroup by
ajoutez simplement une clause ayant après le groupe par
je veux afficher les commentaires dans la déclaration de sélection finale
Y a-t-il une raison pour laquelle vous ne vous contentez pas de les éliminer?
où les commentaires ne sont pas nuls et les commentaires <> ''
@heyNow quels commentaires? Tous? Certains d'entre eux? Vous pouvez utiliser
STRING_AGG
dans SQL Server 2017 pour agréger (concaténer) des chaînes comme vous utiliseriez par exempleSUM ()
sur un champ numérique. Ou vous pouvez utiliser MIN / MAX pour retourner le premier / dernier commentaire@heyNow quel ID souhaitez-vous afficher? La sortie souhaitée indique que vous souhaitez récupérer l'ID minimum par nom. Est-ce que c'est ce que tu veux?
Question modifiée. J'utilise sql-server-2012. Chaque nom peut avoir ou non des lignes supplémentaires avec des commentaires nuls ou vides. L'identifiant n'est pas vraiment important
@heyNow
Chaque nom peut avoir ou non des lignes supplémentaires
signifiant? Que se passe-t-il s'il y a trois commentaires différents pour un seul nom et que l'un d'eux est nul? Voulez-vous n'afficher qu'un un commentaire? Tous les commentaires?désolé cette partie aurait dû être plus claire, il n'y aura que (1 commentaire et / ou commentaire nul / vide) par nom, pas plusieurs commentaires différents non nuls
@heyNow auquel cas un simple
MAX (commentaire), MIN (ID)
fera l'affaire