2

私は2つのテーブルを持っています:

  1. 次のフィールドを持つdoctorreports:
    • DoctorRepID
    • 担当者名
    • 医師名
    • 追加日
  2. フィールドのある病院:
    • 病院ID
    • 担当者名
    • 病院名
    • 医師名
    • 追加日

Doctorreports と Hospitals の各 RepName によって追加されたレコードを、DateAdded でカウントする必要があります。

次のように表示する必要があります。

RepName | DoctorReportsCount | HospitalsReportsCount | DateAdded
        |                    |                       |
  John  |          15        |          12           | 9/4/2012

Doctorsreports テーブルの RepName は、病院テーブルの RepName と同じです。

@bluefeetこれは部分的に必要なものですが、RepNameがこの日付にレコードを追加していない場合、DateAdded = 0になるようにDateAddedフィールドを統一できますか。例:

RepName | DoctorReportsCount | HospitalsReportsCount | DateAdded
        |                    |                       |
  John  |          15        |          12           | 9/4/2012
  Ann   |          9         |           0           | 9/2/2012
Tamer   |          0         |           12          | 9/1/2012
4

2 に答える 2

1

あなたがこれをやろうとしているように聞こえます:

select d.RepName, count(d.RepName) DoctorReportsCount, count(h.RepName) HospitalsReportsCount, d.DateAdded from doctorreports d inner join hospitals h on d.RepName = h.RepName group by d.RepName, d.DateAdded

編集:

select * from ( select d.RepName, count(d.RepName) DoctorReportsCount , d.dateadded from doctorreports d group by d.RepName, d.dateadded ) d left join ( select h.RepName, count(h.RepName) HospitalsReportsCount , h.dateadded hDateadded from hospitals h group by h.RepName, h.dateadded )h on d.RepName = h.RepName

see SQL Fiddle with demo

編集#2、欠落している日のデータを返したい場合は、カレンダーの日付を含むテーブルを作成することをお勧めします。その後、欠落している日のデータを返すことができます。以下は、探しているものを返すはずです。このクエリ用のカレンダー テーブルを作成しました。

select COALESCE(d.drep, '') repname,
  COALESCE(d.DCount, 0) DoctorReportsCount,
  COALESCE(h.HCount, 0) HospitalsReportsCount,
  c.dt Dateadded
from calendar c
left join
(
  select repname drep,
    count(repname) DCount,
    dateadded ddate
  from doctorreports
  group by repname, dateadded
) d
  on c.dt = d.ddate
left join
(
  select repname hrep,
    count(repname) HCount,
    dateadded hdate
  from hospitals
  group by repname, dateadded
) h
  on c.dt = h.hdate
  and d.drep = h.hrep

SQL Fiddle with Demoを参照してください

他の日付を気にしない場合は、dateテーブルなしで次のようにします。

select COALESCE(d.RepName, '') repname,
  COALESCE(d.DoctorReportsCount, 0) DoctorReportsCount,
  COALESCE(h.HospitalsReportsCount, 0) HospitalsReportsCount,
  COALESCE(p.PharmacyReportsCount, 0) PharmacyReportsCount,
  d.dateadded Dateadded
from
(
  select d.RepName,
      count(d.RepName) DoctorReportsCount
    , d.dateadded
  from doctorreports d
  group by d.RepName, d.dateadded
) d
left join
(
  select h.RepName,
    count(h.RepName) HospitalsReportsCount
  , h.dateadded hDateadded
  from hospitals h
  group by h.RepName, h.dateadded
)h
  on d.RepName = h.RepName
  and d.dateadded = h.hDateadded
left join
(
  select p.RepName,
    count(p.RepName) PharmacyReportsCount
  , p.dateadded hDateadded
  from PharmacyReports p
  group by p.RepName, p.dateadded
)p
  on d.RepName = p.RepName
  and d.dateadded = p.hDateadded

SQL Fiddle with Demoを参照してください

于 2012-09-14T17:40:43.397 に答える
0

次の SQL ステートメントは、必要な結果をもたらすはずです。

SELECT 
    RepName,
    SUM(DoctorReports) AS DoctorReportsCount,
    SUM(HospitalReports) AS HospitalReportsCount,
    DateAdded
FROM (
    (SELECT RepName, COUNT(*) AS DoctorReports, 0 AS HospitalReports, DateAdded
     FROM doctorreports
     GROUP BY RepName, DateAdded)
    UNION
    (SELECT RepName, 0 AS DoctorReports, COUNT(*) AS HospitalReports, DateAdded
     FROM hospitals
     GROUP BY RepName, DateAdded)
) AS temp
GROUP BY
    RepName, DateAdded
ORDER BY
    RepName, DateAdded;
于 2012-09-15T14:59:05.497 に答える