COUNT(DISTINCT) dans plusieurs colonnes dans SQL Server 2008
Dans Oracle, il est possible d'obtenir un nombre de valeurs distinctes dans plusieurs colonnes à l'aide de la || opérateur (selon ce post sur le forum, de toute façon):
SELECT COUNT(DISTINCT ColumnA || ColumnB) FROM MyTable
Est-il un moyen de le faire dans SQL Server 2008? Je suis en train de faire une seule requête pour renvoyer certaines statistiques de groupe, mais je n'arrive pas à le faire.
Par exemple, voici un tableau de valeurs, je suis en train de requête:
AssetId MyId TheirId InStock
328 10 10 1
328 20 20 0
328 30 30 0
328 40 10 0
328 10 10 0
328 10 10 0
328 10 10 0
328 10 10 0
Pour AssetId #328, je veux calculer le nombre total d'Identifiants uniques dans le MyId et TheirId colonnes (4 = 10, 20, 30, 40), ainsi que le nombre total de non-zéro lignes de la InStock la colonne (1):
AssetId TotalIds AvailableIds
328 4 1
Est-il un moyen de travailler de cette magie en quelque sorte?
OriginalL'auteur Mass Dot Net | 2012-08-12
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser un
cross apply
etvalues
.SE-Données
Ou vous pouvez faire une
union all
dans une sous-requête.Il n'a pas l'air si sur le plan de l'exécution. Il ne fera qu'une analyse de la table et de la croix appliquer un constant scan. Mais les solutions proposées doivent bien sûr être testé avec une quantité réaliste de données. Il pourrait être une autre histoire avec un grand nombre de lignes.
Désolé pour le redonk retard dans le marquage de votre réponse acceptée, et merci pour la solution. J'espérais une élégante solution native, mais en l'absence de cela, je vais régler pour un travail... cheers!
OriginalL'auteur Mikael Eriksson
Je pense que c'est la bonne solution pour vous
OriginalL'auteur David Weinberg
Vous pouvez obtenir le résultat comme ceci:
Dans l'Expression de Table Commune (
WITH
bloc de code) de "l'unicité" est garantie par l'utilisationUNION
opérateur qui ignore les valeurs en double, c'est pourquoiCOUNT(col)
n'a pas besoin d'être utilisé commeCOUNT(DISTINCT col)
.J'espérais éviter d'utiliser des expressions de table communes, car il tue les performances de ma requête, il augmente de plus de 100% lors du traitement de grands ensembles de données. C'est la solution que j'ai déjà, mais j'espérais qu'il y avait une certaine façon intelligente de le faire, comme avec Oracle "||" de l'opérateur.
OriginalL'auteur Ivan G
Vous pouvez suivre l'Oracle exemple et concaténer les valeurs de l'ensemble (c'est ce que l'Oracle de la requête est en train de faire). Vous avez juste à convertir les valeurs en caractères d'abord:
Vous pouvez aussi le faire comme une sous-requête:
"Théoriquement", j'aime bien la deuxième meilleure approche, car il est plus à base de jeu. Cependant, si vous vous trouvez en essayant de compte les différentes combinaisons de colonnes de différentes variables, la concaténation de chaîne approche est plus pratique.
OriginalL'auteur Gordon Linoff
Si vous n'aimez pas utiliser
CTE's
, vous pouvez essayer d'utiliser la solution suivante. L'essentiel, c'est-à -TotalID's
pour chaqueAssetID
dans un autre sous-requêteAvailableIDs
pour chaqueAssetID
dans un autre sous-requêteJOIN
les résultats des deux sous-requêtes pour produire les résultats finaux.L'énoncé tel qu'il est des œuvres sur l'ensemble de la table. Vous pouvez obtenir les résultats pour une seule AssetID par l'ajout d'une clause where appropriée à l'ensemble du groupe.
Instruction SQL
Script de Test
OriginalL'auteur Lieven Keersmaekers
Option #1
Option #2 Sans CTE
Option #3 Avec CTE
theirID
est également nécessaire.Je pense que
TheirID
n'est pas exigée s'il vous Plaît vérifier l'échantillon de sortie partagé dans la Requête.Par OP je veux calculer le nombre total d'Identifiants uniques dans le MyId et TheirId colonnes je suis assez sûr que
theirID
est obligatoire.OriginalL'auteur eddedeed