2

这应该相当简单,但我找不到我需要的确切语法。我有一个具有 name1 和 name2 字段的表。我只想要字段中所有唯一值的列表以及每个值的计数。例如:

name1       name2
-----------------
smith       jones
jones       williams
evans       williams
elliot      james
williams    smith

而且我要:

name     count
--------------
smith    2
jones    2
Williams 3
evans    1
Elliot   1
james    1

为了获得唯一名称,我使用了联合查询:

select name1 as myname
  from myTable
 union
select name2 as myname
  from myTable

但是我找不到计数的正确语法。有人可以让我摆脱痛苦吗?

4

4 回答 4

6

您应该使用 UNION ALL 而不是 UNION,因为 UNION 将删除所有重复项,而 UNION ALL 则不会。然后您可以将联合查询用作子查询,并进行计数:

SELECT name, COUNT(*)
FROM
  (SELECT name1 name FROM tablename
   UNION ALL
   SELECT name2 name FROM tablename) s
GROUP BY
  name

在此处查看小提琴。

于 2013-08-14T10:40:42.637 回答
2

您可以使用union all

select name, count(*) as cnt
from ((select name1 as name from t) union all
      (select name2 from t)
     ) t
group by name;

union all使用代替非常重要union。后者删除您不想要的重复项。

对于此类较大的查询,使用unpivot或以下构造更有效:

select (case when n.n = 1 then name1 else name2 end) as name, count(*)
from t cross join
     (select 1 as n union all select 2) n
group by (case when n.n = 1 then name1 else name2 end)

union all查询将扫描表两次。这个版本一般只会扫描表一次。

于 2013-08-14T10:41:21.110 回答
1

解决此类问题的另一种典型方法是使用with语法:

-- Put here whatever entangled query you have and mark it "with"
with myQuery as 
  (select name1 as myName
     from myTable
    union all
    select name2 as myName
      from myTable)

-- And now do everything you want with myQuery, as if it's an ordinary table
  select myName as Name,
         Count(*)
    from myQuery
group by myName
于 2013-08-14T10:54:19.723 回答
1
select t.name,count(t.name) count
from 
(
select name1 as name from tbl
union all 
select name2 as name from tbl
)t
group by t.name

SQL小提琴

于 2013-08-14T10:41:16.913 回答