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

问题描述:

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

+0

这是很多人的一个SO解决'不列职位是为x'列#指定他们都有不同的来源但基本上答案/解决方案都是一样的。内部查询缺少列名称。看到这个可能的重复[**没有为'tbl'**'的列1指定列名称(https://*.com/questions/31000895/no-column-name-was-specified-for-column-作为一个例子)。 – Nope

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

你需要给第三列的别名:

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 
+0

第二个子查询中不需要计数的别名。 –

+3

@TimBiegeleisen从技术上讲,不,你是对的。但这只是个习惯,总是让双方都感到混淆。 – Siyual

你只需要一个别名列:

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 
+1

第二个子查询中不需要计数的别名。 –

+0

哈哈!是的,只是出于习惯。编辑! –

不要做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; 
+0

谢谢你的回答。我使用了'UNION'查询来检查两个'result'集合是否相等。在使用'UNION'后,如果我得到count大于两个表中的任何一个,这意味着它们没有相同的数据。这就是我使用'UNION'的原因。 –

+0

@ Alexandru-IonutMihai。 。 。这是对'UNION'的误用。您应该使用类似'FULL OUTER JOIN'的东西来代替。也许你应该问一个关于完成你的目标的最佳途径的另一个问题。而且,如果你的是低调的话,我认为在这种情况下它是无礼的。 –

+0

不,我在发布答案时赞成你。 –