Sql server 计算完全外部联接中的子查询数

Sql server 计算完全外部联接中的子查询数,sql-server,Sql Server,我正在使用SQL Server 2012。我的SQL遵循以下结构 SELECT A.attributeA ,A.attributeB ,Count(A.*) AS CountA -- I know this is wrong. ,Count(B.*) AS CountB FROM ( SELECT ... FROM Foo1 ) A FULL OUTER JOIN ( SELECT ... FROM Foo2 ) B ON A.at

我正在使用SQL Server 2012。我的SQL遵循以下结构

SELECT A.attributeA
       ,A.attributeB
       ,Count(A.*) AS CountA  -- I know this is wrong. 
       ,Count(B.*) AS CountB
FROM
(
    SELECT ... FROM Foo1
) A
FULL OUTER JOIN 
(
    SELECT ... FROM Foo2
) B
ON A.attribute1 = B.attribute1
GROUP BY
A.attributeA
,A.attributeB

我想对子查询A和B中的所有行进行计数。我该怎么做?先谢谢你

假设目标是只计算联接每一侧的非null记录,则可以指定期望为非null的列名(如注释中所述),通常与联接中的列相同。例如,由于您是在attribute1上加入的:

SELECT A.attributeA
       ,A.attributeB
       ,Count(A.attribute1) AS CountA 
       ,Count(B.attribute1) AS CountB
FROM
...
请注意,如果这是您的目标的一部分,那么这不会告诉您这两个重叠的时间。对于该类型的计数,您可以使用与大小写相结合的总和:

SELECT A.attributeA
       ,A.attributeB
       ,Count(A.attribute1) AS CountA 
       ,Count(B.attribute1) AS CountB
       ,SUM(CASE WHEN A.attribute1 IS NOT NULL AND B.attribute1 IS NOT NULL
                 THEN 1 ELSE 0 
            END) as CountAAndBOverlap
FROM
...

如果您的目的只是获取两个子查询的计数,那么您可以执行如下操作。我还为这两个子查询生成了公共
ID
,这样我就可以
JOIN
它们了。最后,我使用了
internaljoin
而不是
FULL JOIN

SELECT 
      CountSubqueryA AS CountA,
      CountSubqueryB AS CountB
FROM
(SELECT 1 AS ID,COUNT(*) AS CountSubqueryA FROM Foo1 ) AS A
INNER JOIN 
(SELECT 1 AS ID,COUNT(*) AS CountSubqueryB FROM Foo2 ) AS B
ON A.ID=B.ID

我看到了你的
小组,我想也许你想要这个。它将创建最多3个类似以下内容的组:

==========================
|   A   | NOT B |   24   |
--------------------------
| NOT A |   B   |   31   |
--------------------------
|   A   |   B   |   69   |
==========================

SELECT
    CASE WHEN A.attribute1 IS NOT NULL THEN 'A' ELSE 'NOT A' END,
    CASE WHEN B.attribute1 IS NOT NULL THEN 'B' ELSE 'NOT B' END
    COUNT(*)
FROM
(
    SELECT ... FROM Foo1
) A
FULL OUTER JOIN 
(
    SELECT ... FROM Foo2
) B
ON A.attribute1 = B.attribute1
GROUP BY
    CASE WHEN A.attribute1 IS NOT NULL THEN 'A' ELSE 'NOT A' END,
    CASE WHEN B.attribute1 IS NOT NULL THEN 'B' ELSE 'NOT B' END

COUNT(A.ID)
maybe?您的问题是当连接的一侧为null时,会抛出null行吗?只需执行count(1)或count(*),而不是只指定一侧或另一侧的列