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

时间:2017-10-11 15:37:47

标签: sql sql-server sql-server-2017

我想从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

我收到了以下错误:

  

没有为x

的第3列指定列

4 个答案:

答案 0 :(得分:3)

您需要为要应用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

答案 1 :(得分:2)

您需要为第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

答案 2 :(得分:1)

您只需要该列的别名:

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

答案 3 :(得分:1)

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

以下给出了行计数以及每个表中唯一计数的总和:

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;