Tsql sql联接如果值存在于其他表中,则对其进行计数

Tsql sql联接如果值存在于其他表中,则对其进行计数,tsql,sql-server-2008-r2,Tsql,Sql Server 2008 R2,我有以下表格 表A UserID | key 1 | A 2 | B 3 | A 4 | C 5 | 用户ID |键1 | A2 | B3 | A4 | C5 | 表B UserID | Num1 | 501 | 3002 |3 | 1004 | 20 用户ID | Num1 | 501 | 3002 |3 | 1004 | 20 我有这样的疑问 SELECT COUNT(key) AS cnt

我有以下表格

表A

UserID | key
1 | A
2 | B
3 | A
4 | C
5 |
用户ID |键
1 | A
2 | B
3 | A
4 | C
5 |
表B

UserID | Num
1 | 50
1 | 300
2 |
3 | 100
4 | 20 用户ID | Num
1 | 50
1 | 300
2 |
3 | 100
4 | 20 我有这样的疑问

SELECT COUNT(key) AS cnt, key 
FROM A 
WHERE key <> '' 
GROUP BY key 
ORDER BY cnt DESC
key | cnt
A | 2
B | 1
C | 1
选择计数(键)作为cnt,键
从
“钥匙在哪里?”
按键分组
按cnt DESC订购
结果应该是这样的

SELECT COUNT(key) AS cnt, key 
FROM A 
WHERE key <> '' 
GROUP BY key 
ORDER BY cnt DESC
key | cnt
A | 2
B | 1
C | 1
键| cnt
A | 2
B | 1
C | 1
我想补充的是加入表B。
如果UserID在表B的Num中有值,我想用/Num按键分组来计算UserID

这里是期望的结果

key | cnt | Has Num?
A | 2 | 2
B | 1 | 0
C | 1 | 1
键| cnt|Has Num?
A | 2 | 2
B | 1 | 0
C | 1 | 1
我试图编写子查询,但无法将其附加到主查询。子查询是这样的

SELECT COUNT(DISTINCT UserID) AS num 
FROM B 
LEFT OUTER JOIN A ON B.UserID = A.UserID 
WHERE Num <>'' AND key <> '' 
GROUP BY key
选择COUNT(不同的UserID)作为num
从B
B.UserID=A.UserID上的左外部联接A
其中Num“”和key“”
按键分组

外部应用程序如何

SELECT [Key], COUNT(a.[Key]) AS cnt, SUM(x.NumCount) AS [Has Num?]    
FROM @TableA a
OUTER APPLY (SELECT COUNT(NUM) AS NumCount 
             FROM  @TableB b 
             WHERE b.UserId = a.UserId AND Num IS NOT NULL
            ) x
WHERE [Key] <> '' 
GROUP BY [Key]
ORDER BY cnt DESC

如果我理解正确的话,您要查找的是表a中的键被用户ID使用时的计数,然后是表B中唯一的用户ID的计数,这些用户ID都出现在第一个表a查询中,并且有一个Num

试试这个:

SELECT a.[Key], COUNT(a.[Key]) AS cnt, isNull(SUM(b.bCnt), 0) AS [Has Num?]
FROM #TableA a
LEFT OUTER JOIN (
    SELECT b.UserID, 1
    FROM #TableB b
    WHERE LEN(b.Num) > 0
    GROUP BY b.UserID
) b (UserID, bCnt) ON b.UserID = a.UserID
WHERE LEN(a.[Key]) > 0 
GROUP BY a.[Key] 

此查询提供了您期望的结果

为什么A的[Has Num?]是2…它一定是3