Sql server 如何在SQL中连接动态表和表

Sql server 如何在SQL中连接动态表和表,sql-server,Sql Server,我有两张桌子Phone和Name。 表Name包含两个字段Name和PhoneNo。 表电话包含电话号码和通话持续时间。 表名 Name PhoneNo. A 1111 B 2222 C 3333 和电话表中的数据 PhoneNo CallDuration 1111 30 5555 40 6666 30 1111 20 6

我有两张桌子
Phone
Name
。 表
Name
包含两个字段
Name
PhoneNo
。 表
电话
包含
电话号码
通话持续时间
。 表名

Name     PhoneNo.

A         1111

B         2222

C         3333
和电话表中的数据

PhoneNo        CallDuration

1111            30

5555            40

6666            30

1111            20

6666            10

2222            5
结果应该是一个表,该表将包含两列
调用者
事件
。如果
呼叫者
存在于
姓名
表中,则她或他的
姓名
应出现在
呼叫者
列中,且其呼叫次数(从
电话
表中)否则
号码
应出现在
呼叫者
列中。 下面示例的结果应该是这样的

Caller     Ocucrnce

A             2

B             1

5555          1

6666          2
我已经试过了,但现在我不知道如何检查这个数字是否在名称表中

select PhoneNo,COUNT(*) as CALLER from PhoneNo GROUP BY PhoneNo

试试这个:使用
Count
的简单连接可以在这里工作。Count将计算出现次数

select case when ph.Name is NULL then cal.PhoneNo  else ph.Name end 
,COUNT(*) as Occrnce
 from PhoneNo ph left join CallDuration cal
on ph.PhoneNO=cal.PhoneNo
这个怎么样

select
    PhoneNo = isnull(n.name, p.PhoneNo),
    Occurence = count(*)
from phone p
left join name n
    on n.PhoneNo = p.PhoneNo
group by
    p.phoneNo, n.name
编辑 要包括
C
,请尝试以下操作:

select
    PhoneNo = isnull(n.name, p.PhoneNo),
    Occurence = count(p.phoneNo)
from phone p
full join name n
    on n.PhoneNo = p.PhoneNo
group by
    p.phoneNo, n.name
试试这个

SELECT   isnull(Caller     ,PhoneNo) as Caller
        ,COUNT(*) AS CALLER 
FROM     PhoneNo AS p
            LEFT JOIN NameTable AS n ON p.PhoneNo        = n.PhoneNo        
GROUP BY PhoneNo,Caller

按PhoneNo分组,并通过使用join…

来检查名称表中是否有出现,以获取将查询结果与
名称
表联接所需的名称,例如:

SELECT ISNULL(n.Name,p.PhoneNo) as Caller, Occurences
FROM (SELECT PhoneNo, COUNT(*) AS Occurences 
      FROM Phone 
      GROUP BY PhoneNo) p 
LEFT OUTER JOIN Name n ON p.PhoneNo=n.PhoneNo
或者,您可以将两个表连接起来,然后按照wewesthemenace建议的那样,按
Phone.PhoneNo
和'Name.Name'分组:

select
    PhoneNo = isnull(n.name, p.PhoneNo),
    Occurence = count(*)
from phone p
left join name n
    on n.PhoneNo = p.PhoneNo
group by
    p.phoneNo, n.name

在这两种情况下,结果都是您想要的结果

您自己是否尝试过任何方法,或者您只是希望我们为您完成工作?请查看我的答案。在此查询中,呼叫者名称不出现。您的架构中没有呼叫者名称的信息。。。我们没有足够的信息这不是我的问题,但请查看所需的输出。callerName表示名称字段。更新了我的答案@NavneetThis将无法编译,您需要指定要使用的两个PhoneNo列中的哪一个。如果使用“名称”表中的名称,您将错过此查询中不带名称的条目“C”用户记录不需要。@Navneet否,它将返回所需的结果。如果我还需要电话表中不存在的名称,它将返回所需的结果。就像我的例子“C”。在最终结果中,“C”也以“0”的形式出现。最终结果应该与此查询中的调用者Occronce A 2 B 1 5555 1 6666 2 C 0类似。调用者No not come。