合并列并获取计数 SQL Server 2008

Posted

技术标签:

【中文标题】合并列并获取计数 SQL Server 2008【英文标题】:Combine columns and get count SQL Server 2008 【发布时间】:2018-01-10 16:40:55 【问题描述】:

请原谅,我仍在学习,但需要一些帮助。我所做的一些事情是以前问题的混合体,但我找不到我要找的东西。

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

您可以使用 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]

【讨论】:

这给了我每个名字的计数 1。 哎呀,对不起@Dan,UNION 应该是UNION ALL 这个。是。美丽的!非常感谢。我为我对这个问题的无知道歉。仍在学习所有这些东西的含义。 它在没有分号的情况下仍然有效。有什么特别的原因或意义吗? 分号是 SQL Server 中的语句终止符。它大多不是必需的,有一些例外。在编写 CTE 时,您必须在 CTE ;WITH... 之前的语句之后显式使用一个。如果您在 CTE 之前没有语句,那么您可能不需要分号。最好的做法是始终在 CTE 块的开头使用一个。在这里查看更多信息:docs.microsoft.com/en-us/sql/t-sql/queries/…

以上是关于合并列并获取计数 SQL Server 2008的主要内容,如果未能解决你的问题,请参考以下文章

Sql Server 2008 MERGE - 获取计数的最佳方式

根据 SQL Server 2008R2 中表中的列获取计数

如何在 sql server 2008 的同一张表中使用计数和分组方式和自连接?

sql server 2008 r2备份的数据可以合并吗?

SQL Server 2008 R2:计数字符匹配

SQL Server 2008 中的数据转换