合并列并计算SQL Server 2008

时间:2018-01-10 16:40:56

标签: sql-server-2008

原谅我,我还在学习,但需要一些帮助。我所做的一些事情是先前问题的混合,但我找不到我正在寻找的东西。

我有一个包含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)

但我想我正在做出愚蠢的假设。有什么建议吗?

1 个答案:

答案 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]