如何使用计数/'group by'比较进行自连接?

4
在给定的表格中(如何正确地格式化它们?),
primary secondary
A            a
A            b
A            b
B            a
B            a
B            b

我正在尝试使用自连接来获取比较分组计数。

获得以下结果集很容易:

Primary Secondary     Count
A            a          1
A            b          2
B            a          2
B            b          1

使用类似以下的语句:

select primary,secondary,count(*) from foobar group by primary,secondary

但我真正想要的是:

Primary  Secondary Count  Primary  Secondary    Count
A        a         1      B        a             2
A        b         2      B        b             1

当没有计数和分组时,自连接是很简单的。但我似乎无法找到做这件事的方法。 "self join AFTER group by"是否会使这变得不可能?如果我必须玩临时表游戏,我会这样做(虽然我宁愿不这样做),因为真正的目标是一个单独的SQL块(我可以脚本化),而不仅仅是一个选择语句。
目前,我正在执行前者并手动调整数据。你有什么想法吗?
嗯...当然,我头脑中的所有东西对我来说都很明显 ;)
我试图实现的“业务逻辑”是“将'primary A'中'secondary'的计数与'primary B'中'secondary'的计数进行比较”,这就是为什么我没有写出B:B结果集行。但我认为任何把它们放进去的子句都可以被过滤。

看起来你只是把它分成了两列?... - Fosco
2个回答

5
这应该能接近你的需求。我不确定如何确定只有“A”主键行显示为前面的几列,因此无法解释。为什么没有一个:
B b 1 B b 1

例如?
SELECT
    SQ1.primary,
    SQ1.secondary,
    SQ1.[count],
    SQ2.primary,
    SQ2.secondary,
    SQ2.[count]
FROM
(
    SELECT
        primary,
        secondary,
        COUNT(*) AS [count]
    FROM
        Foobar
    GROUP BY
        primary,
        secondary
) AS SQ1
LEFT OUTER JOIN
(
    SELECT
        primary,
        secondary,
        COUNT(*) AS [count]
    FROM
        Foobar
    GROUP BY
        primary,
        secondary
) AS SQ2 ON SQ2.primary = SQ1.secondary

赢了。是的,使我选择这个解决方案的附加业务信息是,我只比较两个显式主键内的计数集。因此,单个连接(实际上我确实不得不使用左连接,足够简单)是正确的方法。各个键作为参数输入子查询中,在顶部指定。这些查询相对简单,但内部查询实际上有3个表,其中有几百万行。结果集仅为32。 - Michael Wilson
2
顺便提一下,那个失踪的美元是因为几十年来使用 SQL,我仍然不知道你可以在 from 子句中进行子查询。 - Michael Wilson
我很高兴它有帮助。我将其更改为使用LEFT OUTER JOIN。 - Tom H

1
如果你正在使用SQL Server,你可以很容易地使用CTE来实现这个功能。
如果不是的话,你可以使用类似以下的查询语句(脑海中)来实现。
SELECT T1.Col1, T1.Col2, T2.Col3, T2.Col4, MyCount
FROM Table1 T1, 
(
    SELECT Col3, Col4, COUNT (*) as MyCount
    FROM Table2
    Group by Col3, Col4
) as T2
WHERE T1.Col1 = T2.Col3
GROUP BY T1.Col1, T1.Col2, T2.Col3, T2.Col4

随着您的查询变得更加复杂,请查看执行计划以获得最佳性能。


我在这里缺少了什么。T2是什么(只是“FROM Table2 T2”吗?) - Michael Wilson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接