Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在sql中使用子查询从其他表中计算id_Sql_Sql Server_Tsql - Fatal编程技术网

在sql中使用子查询从其他表中计算id

在sql中使用子查询从其他表中计算id,sql,sql-server,tsql,Sql,Sql Server,Tsql,我想根据指定的批次统计学生的id。学生id位于其他表中。我尝试的是从包含batchid的dbo.batches获取所有批的详细信息。同时我想数一数那批学生的人数。studentid和批次id位于dbo.studentbatchrelation表中。到目前为止,我尝试的是应用子查询来生成批次的deatil以及特定批次中注册的学生数量 以下是我的疑问: 质疑 批次的表结构 StudentBatchRelation的表结构 我可以更好地使用join 请用提琴给你的表格结构。我能在问题中写表格结构吗?是

我想根据指定的批次统计学生的id。学生id位于其他表中。我尝试的是从包含batchid的dbo.batches获取所有批的详细信息。同时我想数一数那批学生的人数。studentid和批次id位于dbo.studentbatchrelation表中。到目前为止,我尝试的是应用子查询来生成批次的deatil以及特定批次中注册的学生数量

以下是我的疑问:

质疑

批次的表结构

StudentBatchRelation的表结构

我可以更好地使用join


请用提琴给你的表格结构。我能在问题中写表格结构吗?是的,你能。更好。请参考我编辑的问题。此查询如何生成批次的详细信息?选择批次字段;选择B.Id、B.CourseId等。请针对给定答案填写完整的查询。那对我来说更好理解我想,你应该自己做。因为我不知道你的全部要求。我们将帮助您了解可用于您的目的的关键功能。现在,连接是您案例中最重要的功能。我尝试了您的查询,但它给了我一个错误。就像我在TotalStudents之后用b.Id作为batchid跟踪你的查询一样。。。。但是,这给了我一个错误,列“Batches.Id”在选择列表中无效,因为它不包含在此查询的聚合函数中。ActiveBatch正在满足条件。是否需要对查询进行更多更改,很抱歉,我不清楚该注释。在您的查询中,其中b.ActiveBatch=1未满足条件。因此您希望所有学生的计数都不检查其中b.ActiveBatch=1?我确实想检查一下,结果并不像预期的那样。
(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
);
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])
);
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
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