8
votes

Sélectionnez Count (distinct [Nom]) à partir de plusieurs tables

Je peux effectuer la sélection suivante SQL Server de noms distincts (ou non répétitifs) d'une colonne d'une table comme suit: xxx pré>

mais si j'ai plus d'une table ( Toutes ces tables contiennent le champ Nom appelé [nom]) et je dois connaître le nombre de noms non répétés dans deux tables ou plus dans deux tables ou plus. P>

Si je rencontre quelque chose comme ça: P>

SELECT COUNT(DISTINCT [Name]) FROM [MyTable1], [MyTable2], [MyTable3]


3 commentaires

Voulez-vous compter depuis les trois tables? Ou juste de l'un d'eux?


Qu'entendez-vous par «noms non répétitifs»?


OK, disons, la colonne [Nom] de MyTable1 a des valeurs: "John", "Mary", "John", "Aaron". La colonne [Nom] MyTable2 a des valeurs: "Mary", "Aaron", "Aaron", "Marie". La colonne [Nom] de MyTable3 a des valeurs: "John", "Mary", "John", "John". J'ai besoin d'obtenir le compte, tel que: "John" = 5 fois, "Mary" = 4 fois, "Aaron" = 3 fois.


4 Réponses :


19
votes

Après la clarification, utilisez:

  SELECT x.name, COUNT(DISTINCT x.[name])
    FROM (SELECT [name]
            FROM [MyTable]
          UNION ALL
          SELECT [name]
            FROM [MyTable2]
          UNION ALL
          SELECT [name]
            FROM [MyTable3]) x
GROUP BY x.name


5 commentaires

Je pense que vous avez couvert toutes les options maintenant :) +1


Et, le syndicat tout est la bonne façon d'aller, peu importe quelle solution est utilisée :)


Les gars, je m'excuse de vous tromper. Je vais juste apprendre SQL. Je vais aussi curieux, ce code va-t-il gérer des noms dans une matière sensible à la casse, c'est-à-dire que "John" et "John" comptent comme 2, ou comme 1?


@ AHMD0 - La sensibilité à l'analyse est basée sur les paramètres de collation de votre serveur.


Nombre (distinct ...) sur la touche de regroupement entraînera toujours 1 .



6
votes

Edit: Dû changer après avoir vu récemment commentaire.

Cela vous donne-t-il ce que vous voulez? Cela donne un compte pour chaque personne après avoir combiné les rangées de toutes les tables. P>

SELECT [NAME], COUNT(*) as TheCount
FROM
    (
     SELECT [Name] FROM [MyTable1]
     UNION ALL
     SELECT [Name] FROM [MyTable2]
     UNION ALL
     SELECT [Name] FROM [MyTable3]
     ) AS [TheNames]
GROUP BY [NAME]


0 commentaires

1
votes

Voici un autre moyen:

SELECT x.name, SUM(x.cnt)
FROM ( SELECT [name], COUNT(*) AS cnt
       FROM [MyTable]
       GROUP BY [name]
     UNION ALL
       SELECT [name], COUNT(*) AS cnt
       FROM [MyTable2]
       GROUP BY [name]
     UNION ALL
       SELECT [name], COUNT(*) AS cnt
       FROM [MyTable3]
       GROUP BY [name]
     ) AS x
GROUP BY x.name


0 commentaires

1
votes

Si vous avez Différentes quantités de colonnes par table forte>, comme:

  • TABLEF1 a 3 colonnes, LI>
  • TABLEA2 a 2 colonnes, li>
  • TABLEI3 a 1 colonne li> ul>

    Et vous souhaitez compter la quantité de valeurs distinctes de différents noms de colonnes, ce qu'elle m'a été utile dans athenasql strong> était d'utiliser croix rejoindre code> car Votre sortie serait une seule ligne, il ne serait que 1 combinaison: p> xxx pré>

    retournerait une table avec une rangée et leurs comptes: P>

    amt_name1 | amt_name2 | amt_name3 | amt_name4 | amt_name5 | amt_name6
        4123  |    675    |    564    |    2346   |   18667   |    74567
    


0 commentaires