2
votes

Groupe SQL Server en absorbant les valeurs nulles et vides

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    ''  


10 commentaires

Vous groupez également par commentaires. Si vous ne voulez pas cela, n'ajoutez pas de commentaires dans la clause group 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 exemple SUM () 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


4 Réponses :


3
votes

Utilisez simplement MAX () avec commentaires :

select id, name, sum(amount), MAX(comments) 
from table 
group by id, name;


0 commentaires

1
votes

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


1 commentaires

Ceci ne produit pas le résultat souhaité. Le montant doit être additionné



1
votes
ID  Name    Amount  Comments
1   n1      421762  Hello
2   n2      5810    Bye

0 commentaires

1
votes

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


0 commentaires