0

ModuleStaff( 、Staff、 )から取得する 3 つのテーブルがありRolesます。私がやろうとしているのは、データをグリッドビューに 1 行で表示することです。たとえば、staff(adrian)グループ番号 1 と 2 の担当者は次のように表示されます。

StaffName |  RoleName |  GroupNumber

Adrian    |  Lecturer |  1,2

現在、チューターとリーダーのデータベースデータが空白であっても、同じstaff(adrian)ロール名で問題が発生しています。groupnumbers (1 and 2)

私が今得たもの:

StaffName |  RoleName |  GroupNumber

Adrian    |  Lecturer |  1,2

Adrian    |  Tutor    |  1,2

Adrian    |  Leader   |  1,2

あるべき姿:

StaffName |  RoleName |  GroupNumber

Adrian    |  Lecturer |  1,2

Adrian    |  Tutor    |  

Adrian    |  Leader   |  

これが私のコードです:

public DataTable DisplayModuleStaffGroup(string year, string module, string diploma)
{

    try
    {
        using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["MARSConnectionString"].ConnectionString))
        {

            using (SqlCommand cmd = con.CreateCommand())
            {
                cmd.CommandText = "SELECT ms.ModuleCode, ms.ModuleYear, ms.DiplomaID, sr.RoleName, s.StaffName, s.StaffStatus, GroupNumber = ";
                cmd.CommandText += " substring((SELECT ( ', ' + GroupNumber ) FROM ModuleStaff ms2, Staff s2 ";
                cmd.CommandText += " WHERE ms.StaffID = ms2.StaffID AND ms2.StaffID = s2.StaffID ";
                cmd.CommandText += " ORDER BY s2.StaffName, ms2.GroupNumber ";
                cmd.CommandText += " FOR XML PATH( '' )), 3, 1000) ";
                cmd.CommandText += " FROM ModuleStaff ms ";
                cmd.CommandText += " INNER JOIN StaffRoles sr ON ms.RoleID = sr.RoleID ";
                cmd.CommandText += " INNER JOIN Diploma d ON ms.DiplomaID = d.DiplomaID ";
                cmd.CommandText += " INNER JOIN Staff s ON ms.StaffID = s.StaffID ";
                cmd.CommandText += " WHERE (ms.DiplomaID = @dip) AND (ms.ModuleYear = @year) AND (ms.ModuleCode = @code) ";
                cmd.CommandText += " ORDER BY ms.RoleID DESC ";
cmd.Parameters.AddWithValue("@dip", diploma);
                cmd.Parameters.AddWithValue("@year", year);
                cmd.Parameters.AddWithValue("@code", module);

                DataSet dSet = new DataSet();

                using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                {
                    da.Fill(dSet, "DisplayModuleStaffGroup");

                    return dSet.Tables["DisplayModuleStaffGroup"];

                }
            }

        }
    }
    catch
    {
        throw;
    }
    finally
    {
    }
}

rolenameおよびに基づいてグループ番号を取得するために、XML パス/S​​QL ステートメントをクエリする方法がよくわかりませんstaffname。誰でもこれについて私を助けることができますか? ありがとうございました。

4

1 に答える 1

0

SQLのループを通過できます..ここに適用できるアイデアがあります

declare @totalStaff int
declare @totalRoles int
declare @staffCount int
declare @roleCount int
declare @staffId int
declare @staffName varchar(max)
declare @roleId int
declare @roleName varchar(max)
declare @groupCount int
declare @table table(staffName varchar(max),roleName varchar(max),roles varchar(max))

set @staffCount=1
set @roleCount=1
set @totalStaff=(select count(*) from staff)

while(@staffCount<=@totalStaff)
begin
   set @staffId=select a.ID from
                  (select row_number() over(order by ID) as sr,ID from satff)a
           where a.sr=@staffCount
    set @staffName=(select staffName from staff where staffId=@staffId)
    set @totalRoles=(select count(*) from roles where staffId=@staffId)
    while(@roleCount<=@totalRoles)
    begin
    set @roleId=select a.ID from
                (select row_number() over(order by ID) as sr,ID from roles)a
                where a.sr=@roleCount
    set @roleName=(select roleName from roles where roleId=@roleId)
     --now same as above go through the loop for group 
    end
end
于 2013-04-30T10:55:31.890 に答える