Tsql sql联接如果值存在于其他表中,则对其进行计数
我有以下表格 表A UserID | keyTsql 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
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 | cntA | 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 | cntA | 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