给出下表(如何在这里正确格式化这些?)
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结果集行。但是我认为任何可以过滤它们的条款都可以过滤。
答案 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
随着您的查询变得更加复杂,请查看您的执行计划以获得最佳效果。