原谅我,我还在学习,但需要一些帮助。我所做的一些事情是先前问题的混合,但我找不到我正在寻找的东西。
我有一个包含30列数据的表,我们称之为table1。每两列实际上是一组相同类型的数据,这些数据一起具有单独含义。例如col1和col2,就是说一组名字。
像这样:
1 Jim Jeff
2 Mike Ben
3 Mike Mike
4 Peter Jeff
5 Jeff Jim
6 etc etc
此时剩下的28列并不重要。我想在col1和col2中返回一个唯一名称列表以及它们在两列中的总计数。这就是我所拥有的东西,它似乎在某种程度上起作用,但回归存在问题。
SELECT col1, COUNT(*)
FROM table1
GROUP BY col1
UNION
SELECT col2, COUNT(*)
FROM table2
GROUP BY col2
问题是,当col1中的名称也在col2中时,它将返回两个计数。例如,如果我有6个不同的名称,总共100次,每列50个,我可能会看到这样的内容返回上述查询。
Jim 4
Jim 13
Jeff 8
Jeff 19
Mike 11
Mike 34
Ben 4
Brian 2
Peter 5
显然,Jim,Jeff和Mike出现在两个专栏中,而Ben,Brian和Peter只出现在一个专栏中(在我看来哪一个并不重要)。
我需要的是:
Jim 17
Jeff 27
Mike 45
Ben 4
Brian 2
Peter 5
我尝试在GROUP BY中放置一个子查询来强制一个没有计数的联合返回的内容(原谅我,我不太了解SQL,我只是根据我对语言的理解做出假设),意思是:
GROUP BY (SELECT col1 FROM table1 UNION SELECT col2 FROM table2)
但我想我正在做出愚蠢的假设。有什么建议吗?
答案 0 :(得分:1)
您可以使用CTE获取所有名称的列表,然后根据该名称进行计数。
;WITH Names AS
(
SELECT col1 AS [Name]
FROM table1
UNION ALL
SELECT col2 AS [Name]
FROM table2
)
SELECT [Name], COUNT(*)
FROM Names
GROUP BY [Name]