2010-07-12 49 views
3

如下表(如何格式化那些正确吗?)如何使用count /'group by'比较来自我加入?

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的组COUNT(*) ,二次

但什么我真的想要的是:

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

W母鸡计数和分组不被参与,自我连接很简单。但我似乎无法用我的方式来解决这个问题。

“自加入AFTER组”是否使这不可能做到?如果我必须玩临时桌面游戏,我会这样做(尽管我宁愿不要),因为真正的目标是一个单独的sql块(我可以编写脚本),而不仅仅是一个select语句。

此刻我正在做前者并手动padiddling数据。

想法?

  • 中号

嗯......当然,所有在我的脑海中的东西是显而易见的我;)

的“商业逻辑”我正在努力实现的是“比较“主要A”中的“次要”计数到“主要B”中的“次要”计数,这就是为什么我没有写出B:B结果集合行的原因。无论如何过滤

+0

它看起来像你只是把它分成两列?... – Fosco 2010-07-12 17:25:12

回答

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 
+0

+1也许改为左连接,所以你也得到0计数 – Andomar 2010-07-12 17:53:17

+0

赢。是的,这使得我选择的解决方案的额外业务信息是我只比较2个显式主键中的计数集。因此,单一连接(实际上我必须与左连接一起走,很简单)就是要走的路。 单个键进入子选择作为参数,在顶部指定。 查询很简单(e | ish),但内部查询实际上有3个表,其中有几百万行。结果集只有32. – 2010-07-12 18:42:45

+2

顺便说一句,缺少的美元是在使用sql几十年后,我仍然不知道你可以在from子句中做子选择。 – 2010-07-12 18:44:51

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 

当你的查询变得更加复杂,看看以获得最佳性能的执行计划。

+0

我在这里失去了一些东西。什么是T2(是否仅仅是“FROM Table2 T2”?) – 2010-07-12 18:43:25