如何在SQL中执行多对多关系聚合?
我的数据中,列A中的一个值可以对应列B中的多个值,反之亦然。一个小例子:如何在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
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;