如何从联合查询中找出计数?

How to find out the count from union query ?

我想从 UNION 查询中找出行数。

我试过这个:

SELECT COUNT(*) FROM (
   SELECT Platform, DeviceCategory, COUNT(DISTINCT FullVisitorID)
   FROM [Laola].[AGG_0] 
   GROUP BY Platform, DeviceCategory
   UNION
   SELECT Platform, DeviceCategory, COUNT(DISTINCT FullVisitorID) 
   FROM [Laola].[AGG_2] 
   GROUP BY Platform, DeviceCategory
) x

我收到以下错误:

No column was specified for column 3 of x

您需要给第 3 列起一个别名:

SELECT COUNT(*) FROM (
   SELECT Platform, DeviceCategory, COUNT(DISTINCT FullVisitorID) As Count
   FROM [Laola].[AGG_0] 
   GROUP BY Platform, DeviceCategory
   UNION
   SELECT Platform, DeviceCategory, COUNT(DISTINCT FullVisitorID) As Count
   FROM [Laola].[AGG_2] 
   GROUP BY Platform, DeviceCategory
) x

您只需要一个列的别名:

SELECT COUNT(*) 
FROM (
       SELECT Platform, DeviceCategory, COUNT(DISTINCT FullVisitorID) as nr
       FROM [Laola].[AGG_0] 
       GROUP BY Platform, DeviceCategory
       UNION
       SELECT Platform, DeviceCategory, COUNT(DISTINCT FullVisitorID) 
       FROM [Laola].[AGG_2] 
       GROUP BY Platform, DeviceCategory
    ) x

您需要为应用 COUNT 计算的列指定名称。

SELECT COUNT(*) FROM (
   SELECT Platform, DeviceCategory, COUNT(DISTINCT FullVisitorID) Count
   FROM [Laola].[AGG_0] 
   GROUP BY Platform, DeviceCategory
   UNION
   SELECT Platform, DeviceCategory, COUNT(DISTINCT FullVisitorID) 
   FROM [Laola].[AGG_2] 
   GROUP BY Platform, DeviceCategory
) x

不要进行 UNION 查询!它删除重复项。使用 UNION ALL.

下面给出了行计数和来自每个 table 的唯一计数的总和:

SELECT COUNT(*), SUM(cnt)
FROM ((SELECT Platform, DeviceCategory, COUNT(DISTINCT FullVisitorID) as cnt
       FROM [Laola].[AGG_0] 
       GROUP BY Platform, DeviceCategory
      ) UNION ALL
      (SELECT Platform, DeviceCategory, COUNT(DISTINCT FullVisitorID) as cnt
       FROM [Laola].[AGG_2] 
       GROUP BY Platform, DeviceCategory
      )
     ) x;

如果您不使用 COUNT(DISTINCT),则将其从子查询中删除。它会产生开销,我不能 100% 确定优化器会删除它。

从准确、简洁、高效的角度,我推荐:

SELECT COUNT(*)
FROM ((SELECT DISTINCT Platform, DeviceCategory
       FROM [Laola].[AGG_0] 
      ) UNION ALL
      (SELECT DISTINCT Platform, DeviceCategory
       FROM [Laola].[AGG_2] 
      )
     ) x;