Tsql 根据初始选择从第二个表中选择计数

Tsql 根据初始选择从第二个表中选择计数,tsql,select,Tsql,Select,表1: AccountId、ReferenceId、Name(许多其他列) 表2: AccountId、ReferenceId(其他列) 如何进行选择以获得以下内容: AccountId, ReferenceId, [Count(*) in Table2 where accountId and reference ID match.] 1, AB, 1 1, AC, 0 2, AD, 4 2, EF, 0 等 猜测一个连接,但这给了我值,而不是计数? 尝试添加计数,但出现错误?类似于: SE

表1: AccountId、ReferenceId、Name(许多其他列)

表2: AccountId、ReferenceId(其他列)

如何进行选择以获得以下内容:

AccountId, ReferenceId, [Count(*) in Table2 where accountId and reference ID match.]
1, AB, 1
1, AC, 0
2, AD, 4
2, EF, 0

猜测一个连接,但这给了我值,而不是计数? 尝试添加计数,但出现错误?

类似于:

 SELECT T1.AccountId,
       T1.ReferenceId,
       COUNT(T2.ReferenceId) AS Cnt
FROM   Table1 T1
       LEFT JOIN Table2 T2
         ON T1.AccountId = T2.AccountId
            AND T1.ReferenceId = T2.ReferenceId
GROUP  BY T1.AccountId,
          T1.ReferenceId  
SELECT t1.AccountId, t1.ReferenceId, COUNT(t2.AccountId)
FROM Table1 t1
LEFT JOIN Table2 t2 ON t1.AccountId = t2.AccountId AND
                       t1.ReferenceId = t2.ReferenceId
GROUP BY t1.AccountId, t1.ReferenceId
应该有用。诀窍是按两个键值分组,以便可以在其他值上进行聚合。在这种情况下,您只需对其他行的值进行计数(也可以对按行分组的值进行求和或求平均值)。

类似于:

SELECT t1.AccountId, t1.ReferenceId, COUNT(t2.AccountId)
FROM Table1 t1
LEFT JOIN Table2 t2 ON t1.AccountId = t2.AccountId AND
                       t1.ReferenceId = t2.ReferenceId
GROUP BY t1.AccountId, t1.ReferenceId
应该有用。诀窍是按两个键值分组,以便可以在其他值上进行聚合。在这种情况下,只需对其他行的值进行计数(也可以对按行分组的值进行求和或求平均值)。

示例数据

declare @tbl1 table (AccountId INT, ReferenceId int, Name varchar(20))
declare @tbl2 table (AccountId INT, ReferenceId int)

insert into @tbl1 select 1, 10, 'White'
insert into @tbl1 select 2, 20, 'Green'
insert into @tbl1 select 3, 30, 'Black'
insert into @tbl1 select 3, 40, 'Red'

insert into @tbl2 select 1, 10
insert into @tbl2 select 1, 10
insert into @tbl2 select 2, 20
insert into @tbl2 select 3, 30
质疑

样本数据

declare @tbl1 table (AccountId INT, ReferenceId int, Name varchar(20))
declare @tbl2 table (AccountId INT, ReferenceId int)

insert into @tbl1 select 1, 10, 'White'
insert into @tbl1 select 2, 20, 'Green'
insert into @tbl1 select 3, 30, 'Black'
insert into @tbl1 select 3, 40, 'Red'

insert into @tbl2 select 1, 10
insert into @tbl2 select 1, 10
insert into @tbl2 select 2, 20
insert into @tbl2 select 3, 30
质疑


这会过滤表1中与表2不匹配的结果,它应该是
左连接
,而且我认为
计数(t2.*.
无效syntax@Martin它是有效的;我经常用它。我会重新措辞。我知道这不是有效的语法。尝试
选择status,COUNT(t2.*)from master..spt_values在number=object_id group by status上连接sys.objects t2
给出了“*”附近的
错误语法。
gah you's right@Martin我应该更加注意
tsql
标记。这会过滤表1中与表2不匹配的结果,它应该是一个
左连接
而且我认为
计数(t2.*)
是无效的syntax@Martin它是有效的;我经常用它。我会重新措辞。我知道这不是有效的语法。尝试
选择状态、计数(t2.*)从master..spt_values join sys.objects t2 on number=object_id group by status
在“*”附近给出了
错误的语法。
gah您是对的@Martin我应该更仔细地注意
tsql
标记。您需要一个
OUTER
连接来返回计数为零的对象。您应该使用
LEFT join
对于OP要求的内容,
JOIN
不会给出正确的结果您需要一个
OUTER
JOIN来返回计数为零的内容。对于OP要求的内容,您应该使用
LEFT JOIN
,而
JOIN
不会给出正确的结果为什么不必要地使用子查询?@Brian You's right。只是给了一个不同的方法,但不好。使用LEFT JOIN和Group BY的答案更好。为什么不必要地使用子查询?@Brian你是对的。只是给了一个不同的方法,但不好。用左键连接和分组的答案更好。