【问题标题】:Querying data from tables having one-to-many and many-to-one relationships based on the relationship根据关系从具有一对多和多对一关系的表中查询数据
【发布时间】:2013-07-30 07:28:25
【问题描述】:

虽然我现在使用 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 列是多对一的关系。

【问题讨论】:

  • 最好把你的真实数据作为例子展示(你有什么和你想得到什么)
  • 真实数据是什么意思?我已经发布了结构,并且我已经发布了我想要辅导员(Id 列)、学习者(Id 列)和课程(Id 列)的数量。我只能获得课程的数量,而不能获得其他课程的数量。
  • 数据库方案帮你做起来没那么简单

标签: .net sql sql-server sql-server-2008


【解决方案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 上找到一个工作示例。
如果您有任何问题,请发表评论。

【讨论】:

    【解决方案2】:

    您似乎想要group bycount 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
    

    【讨论】:

      【解决方案3】:

      对于课程,您可以计算某个机构的行数(我在这里使用数字 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 玩玩。

      【讨论】:

        猜你喜欢
        • 2019-08-31
        • 1970-01-01
        • 2022-01-10
        • 1970-01-01
        • 1970-01-01
        • 2015-11-05
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        相关资源
        最近更新 更多