0

したがって、3つの異なるものを要求する3つのSQLクエリがありますが、それらを1つのテーブルに結合して、各クエリが各列に表示されるようにしたいと考えています

これらはクエリです:

select b.name, count(*)
from account a join branch b
on a.open_branch_id = b.branch_id
group by b.name;

select b.name, count(*)
from employee e join branch b
on e.assigned_branch_id = b.branch_id
group by b.name;

select b.name, count(*)
from customer c join branch b
on c.city = b.city
group by b.name;

それらを組み合わせる方法がわからないので、クエリ 1 が 1 列に表示され、クエリ 2 が 2 列目に表示され、クエリ 3 が 3 列目に表示されます。

誰にもアイデアはありますか?

ありがとう

4

4 に答える 4

0

次のようにすることができます (SQL Server 2005 以降):

SELECT
   B.Name,
   B.OtherColumnsIfYouLike,
   ACount = IsNull(ACount, 0),
   ECount = IsNull(E.ECount, 0),
   CCount = IsNull(C.CCount, 0)
FROM
   dbo.Branch B
   OUTER APPLY (
      SELECT ACount = Count(*)
      FROM dbo.Account A
      WHERE B.Branch_ID = A.Open_Branch_ID
   ) A
   OUTER APPLY (
      SELECT ECount = Count(*)
      FROM dbo.Employee E
      WHERE B.Branch_ID = E.Assigned_Branch_ID
   ) E
   OUTER APPLY (
      SELECT CCount = Count(*)
      FROM dbo.Customer C
      WHERE B.City = C.City
   ) C
;

使用するクエリは、そのブランチ名の結果がまったくない可能性があるかどうかに注意する必要があります。を使用するとINNER JOIN(または単にJOIN)、適切に表示される代わりにこれらが除外されます0

既存のクエリをそのまま使用すると、次のように機能しますが、パフォーマンスは向上しません。

SELECT
   Name = Coalesce(A.Name, E.Name, C.Name),
   ACount = IsNull(ACount, 0),
   ECount = IsNull(E.ECount, 0),
   CCount = IsNull(C.CCount, 0)
FROM
   (
      select b.name, ACount = Count(*)
      from account a join branch b on a.open_branch_id = b.branch_id
      group by b.name
   ) A
   FULL JOIN (
      select b.name, ECount = Count(*)
      from employee e join branch b on e.assigned_branch_id = b.branch_id
      group by b.name
   ) E ON A.Name = E.Name
   FULL JOIN (
      select b.name, CCount = Count(*)
      from customer c join branch b on c.city = b.city group by b.name
   ) C ON IsNull(A.Name, E.Name) = C.Name
;
于 2013-06-13T00:21:40.677 に答える
0

name 列が同じ値になる場合は、このように結合できます。ただし、クエリから、表示されている名前は支店、従業員、および顧客のようです。

select b.name as Name, count(*) as [Count] into #Result1 from account a join branch b on a.open_branch_id = b.branch_id group by b.name;

select b.name as Name, count(*) as [Count] into #Result2 from employee e join branch b on e.assigned_branch_id = b.branch_id group by b.name;

名前として b.name を選択し、count(*) を [Count] として顧客 c から #Result3 に選択 c.city = b.city group by b.name のブランチ b に参加;

r1.name を選択し、
    r1.[カウント],
    r2.[カウント]、
    r3.[カウント]、
#Result1 から r1 として
        r1.name = r2.name で #Result2 を r2 として左結合
        r1.name = r3.name で #Result3 を r3 として左結合

ドロップテーブル #Result1
ドロップテーブル #Result2
ドロップテーブル #Result3
于 2013-06-13T00:21:43.177 に答える
0

私があなたの質問を理解していれば、各クエリの名前フィールドに基づいて結果を結合しますか? それぞれが同じ名前を持っていると仮定するとJOINs、サブクエリでこれを行うことができます。これは簡略化されたバージョンです(サブクエリを上記のものに置き換えてください):

select t1.name, t1.cnt, 
       t2.name as t2name, t2.cnt as t2cnt, 
       t3.name as t3name, t3.cnt as t3cnt
from 
  (select name, count(1) cnt
   from t1
   group by name) t1 join 
  (select name, count(1) cnt
   from t2
   group by name) t2 on t1.name = t2.name join 
  (select name, count(1) cnt
   from t3
   group by name) t3 on t1.name = t3.name   

編集、コメントを考えると、これがあなたが探しているもののようです:

select b.name, 
  a.acctcnt, e.empcnt, c.citycnt
from branch b
  left join (
    select count(1) acctcnt, open_branch_id
    from account 
    group by open_branch_id
    ) a on a.open_branch_id = b.branch_id 
  left join (
    select count(1) empcnt, assigned_branch_id
    from employee
    group by assigned_branch_id
    ) e on e.assigned_branch_id = b.branch_id 
  left join (
    select count(1) citycnt, city
    from customer 
    group by city
    ) c on c.city = b.city
于 2013-06-13T00:20:57.930 に答える
0

これが最速だと思います:

with a as
(
  select open_branch_id as b_id, count(*) as a_count
  from account a 
  group by open_branch_id 
), e as
(
  select assigned_branch_id as b_id, count(*) as e_count
  from employee e 
  group by assigned_branch_id
), c as
(
  select b.branch_id as b_id, count(*) as c_count
  from customer c join branch b
  on c.city = b.city
  group by b.name
)
select b.name, a.a_count, e.e_count, c.c_count
from branch b
left join a on a.b_id = b.branch_id 
left join e on e.b_id = b.branch_id 
left join c on c.b_id = b.branch_id 
order by b.name
于 2013-06-13T00:35:35.873 に答える