合并列并获取计数 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 中表中的列获取计数