如何通过计数/'分组'进行自我加入?

时间:2010-07-12 17:21:12

标签: sql

给出下表(如何在这里正确格式化这些?)

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

有类似的东西:

选择主要,次要,计数(*) 来自foobar group by primary,secondary

但我真正想要的是:

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

当不涉及计数和分组时,自连接很简单。但我似乎无法绕过这样做。

“自我加入AFTER小组”是否会让这件事无法做到?如果我必须玩临时表游戏,我会这样做(虽然我不愿意),因为真正的目标是单个sql块(我可以编写脚本),而不是单个select语句。

目前我正在做前者并手动填充数据。

思想?

  • 中号

嗯......当然,我头脑中的所有东西对我都很明显;)

我试图实现的“商业逻辑”是“比较'初级A'中'次级'的计数与'初级B'中'次级'的计数',这就是为什么我没有写出来的原因B:B结果集行。但是我认为任何可以过滤它们的条款都可以过滤。

2 个答案:

答案 0 :(得分:4)

这应该让你接近。我不确定你是如何确定只有“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

答案 1 :(得分:1)

如果您使用的是SQL Server,则可以使用CTE轻松完成此操作

如果没有,你可以做这种选择(OTTOMH)

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

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

相关问题