3
votes

Requête SQL - COUNT pour la combinaison de deux colonnes ou plus à partir d'une seule table

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


0 commentaires

3 Réponses :


1
votes

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;

Démo


2 commentaires

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.



0
votes

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


2 commentaires

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.



0
votes

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.


0 commentaires