【问题标题】:SQL Query - COUNT for combination of two or more column from single tableSQL Query - COUNT 用于组合单个表中的两个或多个列
【发布时间】:2019-01-19 06:36:22
【问题描述】:

我有一个包含以下列和行值的表格,并且想要一个如下所示的结果集。我尝试了很多查询,但无法得到我想要的结果集。 有没有最简单的方法来实现这一点。

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

预期结果集:

Name C2Count C3Count C4Count
AAA    2      2        3     
BBB    1      1        1

【问题讨论】:

    标签: sql-server sql-server-2008 sql-server-2012 sql-server-2008-r2


    【解决方案1】:

    无论如何,我看不到要避免进行两个单独的聚合。一个可以处理单个不同的计数,而另一个可以处理两列计数:

    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;
    

    Demo

    【讨论】:

    • 我想从两列或三列的组合中计算 c4 计数。我无法得到这个。请让我知道是否有任何最简单的方法。
    • @Ask_SO 我修正了我的答案。
    【解决方案2】:

    也许您正在寻找这个? :

    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
    

    【讨论】:

    • 碰巧这会产生正确的输出,但 OP 似乎想要第 4 列和第 5 列的不同计数。
    • @TimBiegeleisen 如果我们按 Column1 分组并计数,是不是会给我们与计算 column1 相同的计数?不确定,也许我错过了一些东西。我还更新了查询以适应 OP 请求。
    【解决方案3】:

    我对您希望如何计算 C4count 感到有些困惑。使用这些数据(感谢@iSR5):

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

    您可以使用非常基本的语句来达到预期的效果:

    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
    

    结果:

    Name C2Count C3Count C4Count
    AAA    2      2        3     
    BBB    1      1        1
    

    这将计算第 2 列和第 3 列的 AAA 和 BBB 的每列中有多少不同的匹配项,并计算第 4 列的总体匹配项。您想要的结果没有显示第 5 列的任何内容。

    如果您需要其他类型的计算,请您清楚描述您要查找的内容,以便我可以调整我的代码以显示您要查找的内容。 p>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-31
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 2021-02-26
      相关资源
      最近更新 更多