2

虽然我现在使用 stackoverflow 很长时间了,但这是我第一次发布问题。我希望有人能帮我解决这个问题。

我在 SQL Server 2005 中有这个数据库结构(请看下图),我现在正在使用 Crystal Reports 处理报表。

我想要做的是从数据库中获取特定实施机构的课程、促进者和学习者的总数(这是该图中未显示的另一个表,仅与课程表有关系)。

我可以使用 where 语句中的 ImplementingAgencyID 列获取课程总数,但我不知道如何获取同一机构的促进者和学习者的总数(例如,ImplementingAgencyID 1 或 2)。

有没有办法做到这一点?数据库中已经有数千条记录,因此即使我必须将 ImplementingAgencyID 列添加到所有三个表中,我也无法为旧条目填充此列。它只会为新条目添加。

谁能帮我解决问题?最好的解决方案是什么?我需要选择查询?

--- 我无法发布图片,所以我将列出下面每个表格的重要列 ---

Courses (table):
 Id         int
 SerialNum      nvarchar
 ProvinceID     int
 DistrictID     int
 VillageID      int
 EntryUserID        uniqueidentifier
 NearestSchool      nvarchar
 ImplementingAgencyID   int
 FacilitatorID
 CourseVenueID      int
 ...

Learners (table):
 Id
 CourseID
 LearnerName
 ...

Facilitators (table):
 Id
 SerialNum
 FullName
 Age
 ProvinceID
 DistrictID
 VillageID
 ...

Agencies (table):
  Id
  AgencyNameLocal
  AgencyNameEnglish
  ...

关系: 1: Courses 表中的 ImplementingAgencyID 列与 Agencies 表中的 Id 列存在多对一关系。

2:Learners 表中的 CourseID 列与 Courses 表中的 Id 列是多对一的关系。

3:Courses 表中的 FacilitatorID 列与 Facilitators 表中的 Id 列是多对一的关系。

4

3 回答 3

1

我希望我正确地理解了你。对于每个机构,您想知道每种类型的单元(学习者、促进者、课程)有多少。

这个查询应该做你想做的事:

;WITH data 
     AS (SELECT T1.*, 
                T2.FULLNAME AS Facil_Name, 
                T3.ID       AS Learner_Name, 
                T4.AGENCYNAME 
         FROM   COURSES T1 
                INNER JOIN FACILITATORS T2 
                        ON T1.FACILITATORID = t2.ID 
                INNER JOIN LEARNERS T3 
                        ON T1.ID = T3.COURSEID 
                INNER JOIN AGENCIES T4 
                        ON T1.IMPLEMENTINGAGENCYID = T4.ID) 

SELECT AGENCYNAME, 
       Count(DISTINCT FACIL_NAME) Per_Agency, 
       'Facil'                    TYPE 
FROM   data 
GROUP  BY AGENCYNAME 
UNION 
SELECT AGENCYNAME, 
       Count(DISTINCT LEARNER_NAME) Per_Agency, 
       'Learner'                    TYPE 
FROM   data 
GROUP  BY AGENCYNAME 
UNION 
SELECT AGENCYNAME, 
       Count(DISTINCT ID) Per_Agency, 
       'Course'           TYPE 
FROM   data 
GROUP  BY AGENCYNAME 
ORDER  BY TYPE 

您可以在SQL Fiddle上找到一个工作示例。
如果您有任何问题,请发表评论。

于 2013-07-30T08:00:10.110 回答
1

看起来你想要一个group by和的组合count distinct

select
    implementingagencyid,
    count (distinct courses.id) as CourseCount,
    count (distinct learners.id) as LearnerCount,
    count (distinct facilitators.id) as FacilitatorCount
courses
    inner join learners on courses.ID = learners.courseid
    inner join facilitators on courses.facilitatorID = facilitators.id
    inner join agencies on courses.implementingagencyid = agencies.id    
group by
    implementingagencyid
于 2013-07-30T08:00:37.117 回答
1

对于课程,您可以计算某个机构的行数(我在这里使用数字 77):

SELECT COUNT(*)
FROM courses
WHERE ImplementingAgencyID = 77

对于Facilitators,您可以计算 FacilitatorID 不同值的出现次数

SELECT COUNT(DISTINCT FacilitatorID)
FROM courses
WHERE ImplementingAgencyID = 77

对于学习者,您必须加入课程和学习者表,但是您可以再次计算

SELECT COUNT(DISTINCT l.id)
FROM courses c JOIN learners l ON c.id = l.CourseID
WHERE ImplementingAgencyID = 77

请参阅http://sqlfiddle.com/#!2/59a68/4玩玩。

于 2013-07-30T08:02:44.523 回答