【问题标题】:Count id from other table using sub query in sql使用sql中的子查询从另一个表中计算id
【发布时间】:2017-12-16 07:53:49
【问题描述】:

我想按照指定的批次统计学生的id。学生 ID 位于其他表中。我正在尝试从 dbo.Batches 中获取所有批次的详细信息,其中包含批处理 ID。同时我想计算那批注册的学生人数。 studentid 和批次 id 位于 dbo.studentbatchrelation 表中。到目前为止,我尝试过的是,应用子查询来生成批次的详细信息以及在特定批次中注册的学生人数。

以下是我的查询:

查询

(Select 
     Count(studentId) as TotalStudents 
 from 
     dbo.StudentBatchRelation 
 where 
     BatchId in (Select 
                     b.Id as BatchId, b.CourseId as CourseId, 
                     b.BatchNumber as BatchNumber,
                     b.BatchTimingsFrom as BatchTimingsFrom, 
                     b.BatchTimingsTo as BatchTimingsTo, 
                     b.BatchDuration as Duration, b.BatchDate as BatchDate,
                     b."Days" as "Days", b.CourseRoomId as CourseRoomId,  
                     c.CourseName as CourseName, 
                     cr.RoomName as RoomName, 
                     cr.RoomCapacity as RoomCapacity 
                 from 
                     dbo."Batches" b, dbo.Courses c,
                     dbo.CourseRooms cr 
                 where 
                     b.CourseId = c.Id 
                     and b.CourseRoomId = cr.Id 
                     and b.ActiveBatch = 1  ));

批次的表结构

CREATE TABLE [dbo].[Batches] (
    [Id]               VARCHAR (250) NOT NULL,
    [CourseId]         VARCHAR (250) NOT NULL,
    [BatchNumber]      VARCHAR (250) NOT NULL,
    [BatchTimingsFrom] TIME (7)      NOT NULL,
    [BatchTimingsTo]   TIME (7)      NOT NULL,
    [BatchDuration]    VARCHAR (50)  NOT NULL,
    [Days]             VARCHAR (250) NOT NULL,
    [CourseRoomId]     VARCHAR (250) NOT NULL,
    [BatchDate]        VARCHAR (250) NULL,
    [ActiveBatch]      BIT           DEFAULT ((0)) NULL,
    CONSTRAINT [PK_Batches] PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [FK_BATCHES_COURSE] FOREIGN KEY ([CourseId]) REFERENCES [dbo].[Courses] ([Id]) ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT [FK_BATCHES_CourseRoom] FOREIGN KEY ([CourseRoomId]) REFERENCES [dbo].[CourseRooms] ([Id]) ON DELETE CASCADE ON UPDATE CASCADE
);

StudentBatchRelation 的表结构

CREATE TABLE [dbo].[StudentBatchRelation] (
    [Id]              VARCHAR (250) NOT NULL,
    [BatchId]         VARCHAR (250) NOT NULL,
    [StudentId]       VARCHAR (250) NOT NULL,
    [TransactionId]   VARCHAR (250) NULL,
    [RemainingAmount] VARCHAR (250) NULL,
    [Status]          VARCHAR (250) NULL,
    CONSTRAINT [PK_StudentBatchRelation] PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [FK_StudentBatchRelation_Batch] FOREIGN KEY ([BatchId]) REFERENCES [dbo].[Batches] ([Id]) ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT [FK_StudentBatch_TransactionId] FOREIGN KEY ([TransactionId]) REFERENCES [dbo].[TransactionTable] ([Id]) ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT [FK_StudentBatchRelation_Student] FOREIGN KEY ([StudentId]) REFERENCES [dbo].[User] ([Id])
);

【问题讨论】:

  • 请用小提琴给你的表格结构化
  • 我可以在问题中写表结构吗?
  • 是的,你可以。 (甚至更好)。
  • 请参考我编辑的问题。

标签: sql sql-server tsql


【解决方案1】:

我可以更好地使用join

Select 
     SBR.BatchId, Count(SBR.StudentId) as TotalStudents 
 from 
     dbo.StudentBatchRelation SBR 
     inner join Batches B ON SBR.BatchId = B.Id
     inner join Courses C ON C.Id = B.CourseId
     inner join CourseRooms CR ON CR.Id = B.CourseRoomId
     where B.ActiveBatch = 1
     group by SBR.BatchId

【讨论】:

  • 这个查询如何生成批次的详细信息?
  • 选择批次字段; "选择 B.Id、B.CourseId" 等
  • 能否请您针对您给定的答案写完整的查询。那对我来说会更好理解
  • 我认为,你应该自己做。因为我不知道你的完整要求。我们帮助您了解可用于您的目的的关键功能。现在,在您的情况下,加入是最重要的功能。
  • 我尝试了您的查询,但它给了我一个错误。就像我在 TotalStudents 之后使用 b.Id 作为批处理 ID 跟踪了您的查询......但它给了我一个错误,“列 'Batches.Id' 在选择列表中无效,因为它不包含在任何一个聚合函数中”跨度>
【解决方案2】:
Select 
    b.Id as BatchId, b.CourseId as CourseId, 
    b.BatchNumber as BatchNumber,
    b.BatchTimingsFrom as BatchTimingsFrom, 
    b.BatchTimingsTo as BatchTimingsTo, 
    b.BatchDuration as Duration, b.BatchDate as BatchDate,
    b."Days" as "Days", b.CourseRoomId as CourseRoomId,  
    c.CourseName as CourseName, 
    cr.RoomName as RoomName, 
    cr.RoomCapacity as RoomCapacity 
    ,COUNT(*) OVER (PARTITION BY b.Id) countstudentinBatches
from 
dbo."Batches" b 
INNER JOIN dbo.Courses c ON b.CourseId = c.Id  
INNER JOIN dbo.CourseRooms cr ON b.CourseRoomId = cr.Id 
INNER JOIN dbo.StudentBatchRelation sr ON sr.BatchId = b.Id
WHERE b.ActiveBatch = 1

【讨论】:

  • 在此查询中,b.ActiveBatch 满足条件。
  • 您是否需要对查询进行更多更改,抱歉我的评论不清楚。
  • 在您的查询中,“where b.ActiveBatch = 1”未完全满足条件。
  • 所以你想要所有学生的数量而不检查 b.ActiveBatch = 1 的位置。?
  • 我确实想检查一下,结果未达到预期。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-16
相关资源
最近更新 更多