J'ai un tableau avec les valeurs de colonne et de ligne ci-dessous et je veux un ensemble de résultats comme indiqué ci-dessous. J'ai essayé de nombreuses requêtes mais je n'ai pas pu obtenir le résultat souhaité. Existe-t-il un moyen le plus simple d'y parvenir?
Name C2Count C3Count C4Count AAA 2 2 3 BBB 1 1 1
Ensemble de résultats attendus:
Column1 Column2 Column3 Column4 Column5 AAA 000000 BG1 12345 North AAA 111111 BG2 23456 South BBB 000000 BG3 12346 EAST AAA 000000 BG2 12345 West Select Column1,Count( Distinct Column1,Column2),Count(Distinct Column1,Column3),Count(Column1,Column4,Column5) From #Temp
3 Réponses :
Je ne vois pas de toute façon éviter de faire deux agrégations distinctes. L'un peut gérer les comptages distincts uniques tandis que l'autre peut gérer le nombre de deux colonnes:
WITH cte1 AS ( SELECT Column1 AS Name, COUNT(DISTINCT Column2) AS C2Count, COUNT(DISTINCT Column3) AS C3Count FROM yourTable GROUP BY Column1 ), cte2 AS ( SELECT Name, COUNT(*) AS C45Count FROM ( SELECT DISTINCT Column1 AS Name, Column4, Column5 FROM yourTable ) t GROUP BY Name ) SELECT t1.Name, t1.C2Count, t1.C3Count, t2.C45Count FROM cte1 t1 INNER JOIN cte2 t2 ON t1.Name = t2.Name;
Je veux compter à partir de la combinaison de deux ou trois colonnes pour le compte c4. Je n'ai pas pu comprendre cela. S'il vous plaît laissez-moi savoir s'il existe un moyen le plus simple.
@Ask_SO J'ai corrigé ma réponse.
Vous recherchez peut-être ceci? :
DECLARE @tb TABLE ( Column1 VARCHAR(50) , Column2 VARCHAR(50) , Column3 VARCHAR(50) , Column4 INT , Column5 VARCHAR(50) ) INSERT INTO @tb VALUES ('AAA','000000','BG1',12345,'North'), ('AAA','111111','BG2',23456,'South'), ('BBB','000000','BG3',12346,'EAST'), ('AAA','000000','BG2',12345,'West') SELECT Column1 [Name] , COUNT(DISTINCT Column2) C2Count , COUNT(DISTINCT Column3) C3Count , SUM(C45Count) C4Count FROM ( SELECT *, COUNT(Column1) OVER(PARTITION BY Column1, Column4, Column5) C45Count FROM @tb ) D GROUP BY Column1
Cela arrive par coïncidence pour générer la sortie correcte, mais l'OP semble vouloir le décompte distinct des colonnes 4 et 5.
@TimBiegeleisen Si nous groupons par Colonne1, et comptons, ne va-t-il pas nous donner le même décompte que compter Colonne1? pas sûr, peut-être que je rate quelque chose. J'ai également mis à jour la requête pour l'adapter à la demande OP.
Je ne sais pas trop comment vous voulez calculer le C4count. En utilisant ces données (merci @ iSR5):
Name C2Count C3Count C4Count AAA 2 2 3 BBB 1 1 1
Vous pouvez utiliser une déclaration assez basique pour obtenir les résultats souhaités:
SELECT Column1 AS [Name] ,COUNT(DISTINCT t.Column2) AS C2Count ,COUNT(DISTINCT t.Column3) AS C3Count ,COUNT(t.Column4) AS C4Count FROM #Table t GROUP BY t.Column1
Résultats:
CREATE TABLE #Table ( Column1 VARCHAR(50) , Column2 VARCHAR(50) , Column3 VARCHAR(50) , Column4 INT , Column5 VARCHAR(50) ) INSERT INTO #Table VALUES ('AAA','000000','BG1',12345,'North'), ('AAA','111111','BG2',23456,'South'), ('BBB','000000','BG3',12346,'EAST'), ('AAA','000000','BG2',12345,'West')
Cela comptera le nombre de correspondances distinctes dans chaque colonne pour AAA et BBB pour la colonne 2 et la colonne 3, et comptera les correspondances globales pour la colonne 4. Les résultats souhaités ne montrent rien pour la colonne 5.
Si vous souhaitez un autre type de calcul, pourriez-vous clairement décrire ce que vous recherchez afin que je puisse ajustez mon code pour montrer ce que vous recherchez.