如何在SQL中执行多对多关系聚合?

如何在SQL中执行多对多关系聚合?,sql,aggregate,aggregate-functions,Sql,Aggregate,Aggregate Functions,我的数据中,列A中的一个值可以对应列B中的多个值,反之亦然。一个小例子: COLUMN_A | COLUMN_B =================== A | X A | Y A | Z B | Y B | Y C | X C | X D | X D | Z D

我的数据中,列A中的一个值可以对应列B中的多个值,反之亦然。一个小例子:

 COLUMN_A  | COLUMN_B
 ===================
     A     |    X
     A     |    Y
     A     |    Z
     B     |    Y
     B     |    Y
     C     |    X
     C     |    X
     D     |    X
     D     |    Z
     D     |    Z
我希望看到的是列A中有多少个唯一实例对应列B中的一个唯一实例。因此,我希望我的输出如下所示:

 COLUMN_B | # INSTANCES OF COLUMN_A | VALUES IN COLUMN_A
 =======================================================
     X    |            3            |         A    
     X    |            3            |         C    
     X    |            3            |         D 
 -------------------------------------------------------  
     Y    |            2            |         A   
     Y    |            2            |         B
 -------------------------------------------------------
     Z    |            2            |         A  
     Z    |            2            |         D  
我似乎不知道这是一种分组方式,一种连接方式,还是两者兼而有之


谢谢。

按表中的列_b进行聚合,并将其连接到原始表以获得列_a中的相应值

SELECT t.column_b,
       t.cnt,
       tn.column_a
FROM
  (SELECT column_b,
          count(*) cnt
   FROM tablename
   GROUP BY column_b) t
JOIN tablename tn ON t.column_b = tn.column_b

按表中的列_b进行聚合,并将其连接到原始表以获得列_a中的相应值

SELECT t.column_b,
       t.cnt,
       tn.column_a
FROM
  (SELECT column_b,
          count(*) cnt
   FROM tablename
   GROUP BY column_b) t
JOIN tablename tn ON t.column_b = tn.column_b

通过使用简单分区

    DECLARE @Table1 TABLE 
        (COLUMN_A varchar(1), COLUMN_B varchar(1))
    ;

    INSERT INTO @Table1
        (COLUMN_A, COLUMN_B)
    VALUES
        ('A', 'X'),
        ('A', 'Y'),
        ('A', 'Z'),
        ('B', 'Y'),
        ('B', 'Y'),
        ('C', 'X'),
        ('C', 'X'),
        ('D', 'X'),
        ('D', 'Z'),
        ('D', 'Z')
    ;


select  COLUMN_B,
        COUNT(COLUMN_B)OVER(PARTITION BY COLUMN_B  )RN ,
        COLUMN_A 
    FROM @Table1
        GROUP BY 
         COLUMN_A,
         COLUMN_B

通过使用简单分区

    DECLARE @Table1 TABLE 
        (COLUMN_A varchar(1), COLUMN_B varchar(1))
    ;

    INSERT INTO @Table1
        (COLUMN_A, COLUMN_B)
    VALUES
        ('A', 'X'),
        ('A', 'Y'),
        ('A', 'Z'),
        ('B', 'Y'),
        ('B', 'Y'),
        ('C', 'X'),
        ('C', 'X'),
        ('D', 'X'),
        ('D', 'Z'),
        ('D', 'Z')
    ;


select  COLUMN_B,
        COUNT(COLUMN_B)OVER(PARTITION BY COLUMN_B  )RN ,
        COLUMN_A 
    FROM @Table1
        GROUP BY 
         COLUMN_A,
         COLUMN_B

使用相关子查询进行计数:

select distinct column_b,
                (select count(distinct ca) from tablename t2
                 where t1.column_b = t2.column_b),
                column_a
from tablename t1
order by column_b, column_a;

使用相关子查询进行计数:

select distinct column_b,
                (select count(distinct ca) from tablename t2
                 where t1.column_b = t2.column_b),
                column_a
from tablename t1
order by column_b, column_a;