从多个表中选择 COUNT(DISTINCT [name])

问题描述 投票:0回答:5

我可以执行以下 SQL Server 从一个表中的列中选择不同(或不重复的名称)的操作,如下所示:

SELECT COUNT(DISTINCT [Name]) FROM [MyTable]

但是,如果我有多个表(所有这些表都包含名为 [Name] 的名称字段)并且我需要知道两个或多个表中不重复名称的计数,该怎么办?

如果我运行这样的事情:

SELECT COUNT(DISTINCT [Name]) FROM [MyTable1], [MyTable2], [MyTable3]

我收到错误“列名‘名称’不明确”。

PS。所有三个表 [MyTable1]、[MyTable2]、[MyTable3] 都是先前选择的产物。

sql sql-server select count distinct
5个回答
21
投票

澄清后,使用:

  SELECT x.name, COUNT(x.[name])
    FROM (SELECT [name]
            FROM [MyTable]
          UNION ALL
          SELECT [name]
            FROM [MyTable2]
          UNION ALL
          SELECT [name]
            FROM [MyTable3]) x
GROUP BY x.name

如果我理解正确,请使用:

  SELECT x.name, COUNT(DISTINCT x.[name])
    FROM (SELECT [name]
            FROM [MyTable]
          UNION ALL
          SELECT [name]
            FROM [MyTable2]
          UNION ALL
          SELECT [name]
            FROM [MyTable3]) x
GROUP BY x.name

UNION
将删除重复项;
UNION ALL
不会,而且速度更快。


6
投票

编辑:看到最近的评论后必须更改。

这能给你你想要的吗?合并所有表中的行后,这会给出每个人的计数。

SELECT [NAME], COUNT(*) as TheCount
FROM
    (
     SELECT [Name] FROM [MyTable1]
     UNION ALL
     SELECT [Name] FROM [MyTable2]
     UNION ALL
     SELECT [Name] FROM [MyTable3]
     ) AS [TheNames]
GROUP BY [NAME]

1
投票

还有另一种方法:

SELECT x.name, SUM(x.cnt)
FROM ( SELECT [name], COUNT(*) AS cnt
       FROM [MyTable]
       GROUP BY [name]
     UNION ALL
       SELECT [name], COUNT(*) AS cnt
       FROM [MyTable2]
       GROUP BY [name]
     UNION ALL
       SELECT [name], COUNT(*) AS cnt
       FROM [MyTable3]
       GROUP BY [name]
     ) AS x
GROUP BY x.name

1
投票

如果您每个表有不同数量的列,例如:

  • table1 有 3 列,
  • table2 有 2 列,
  • table3 有 1 列

并且您想要计算不同列名的不同值的数量,在 AthenaSQL 中对我有用的是使用

CROSS JOIN
,因为您的输出只有一行,它只是 1 个组合:

SELECT * FROM (
SELECT COUNT(DISTINCT name1) as amt_name1,
       COUNT(DISTINCT name2) as amt_name2,
       COUNT(DISTINCT name3) as amt_name3,
FROM table1 ) t1
CROSS JOIN
(SELECT COUNT(DISTINCT name4) as amt_name4,
        COUNT(DISTINCT name5) as amt_name5,
        MAX(t3.amt_name6) as amt_name6
 FROM table2
 CROSS JOIN
 (SELECT COUNT(DISTINCT name6) as amt_name6
  FROM table3) t3) t2

将返回一个包含一行及其计数的表格:

amt_name1 | amt_name2 | amt_name3 | amt_name4 | amt_name5 | amt_name6
    4123  |    675    |    564    |    2346   |   18667   |    74567

0
投票

来自 PostgreSQL 示例的一个更新的解决方案,用于获取所有唯一股票(在本例中)名称的授权总额,并包含在一个漂亮的视图中:

CREATE OR REPLACE VIEW data.view_count_distinct_symbols 
  AS
    SELECT COUNT(*) 
      FROM (SELECT DISTINCT symbol_name FROM data.d_bats_etf
          UNION ALL
            SELECT DISTINCT symbol_name FROM data.d_bats_stock
          UNION ALL
            SELECT DISTINCT symbol_name FROM data.d_nasdaq_etf
          UNION ALL
            SELECT DISTINCT symbol_name FROM data.d_nasdaq_stock
          UNION ALL
            SELECT DISTINCT symbol_name FROM data.d_nyse_arca_etf
          UNION ALL
            SELECT DISTINCT symbol_name FROM data.d_nyse_arca_stock
          UNION ALL
            SELECT DISTINCT symbol_name FROM data.d_nyse_etf
          UNION ALL
            SELECT DISTINCT symbol_name FROM data.d_nyse_mkt_etf
          UNION ALL
            SELECT DISTINCT symbol_name FROM data.d_nyse_mkt_stock
          UNION ALL
            SELECT DISTINCT symbol_name FROM data.d_nyse_stock);

...

    |count 
    |bigint
-----------
    | 28794
© www.soinside.com 2019 - 2024. All rights reserved.