C# where子句中有多个列值
我需要显示每周的单用户时间表,如时间表 场景:一名教员在同一日期(2015年6月30日)在一周内被分配到多个批次(例如:BBA、数学和第1小时和第2小时的上午)和(MBA、数学、第3小时和第4小时的上午)。gridview的I行将存储为1行,2行存储为2行,依此类推 我的表格定义:C# where子句中有多个列值,c#,sql,sql-server,tsql,C#,Sql,Sql Server,Tsql,我需要显示每周的单用户时间表,如时间表 场景:一名教员在同一日期(2015年6月30日)在一周内被分配到多个批次(例如:BBA、数学和第1小时和第2小时的上午)和(MBA、数学、第3小时和第4小时的上午)。gridview的I行将存储为1行,2行存储为2行,依此类推 我的表格定义: CREATE TABLE [dbo].[test] ( [datedif] NVARCHAR (50) NOT NULL, [hour] INT N
CREATE TABLE [dbo].[test] (
[datedif] NVARCHAR (50) NOT NULL,
[hour] INT NULL,
[subject] NVARCHAR (MAX) NULL,
[faculty] NVARCHAR (MAX) NULL,
[attendence] BIT NULL,
[dayweek] NVARCHAR (50) NULL,
[weekmonth] NVARCHAR (MAX) NULL,
[batch] NVARCHAR (MAX) NULL,
[section] NVARCHAR (MAX) NULL,
[session] NVARCHAR (MAX) NULL
);
表如下所示:
Datefdiff | hour | subject | faulty| batch
----------+-------+----------+---------+-------+----------+--------+-------+----------+---------+-------
30-06-2015| 1| Maths | Kevin | BBA
30-06-2015| 2| Science | Amal | MBA
30-06-2015|3 | chemistry|Jaya |BBA
30-06-2015|4 | chemistry|Jaya |BBA
30-06-2015|5 | chemistry|Jaya |BBA
31-06-2015 |1| science | Amal |BBA
31-06-2015 |2| Maths | kevin |BBA
31-06-2015 |3| Science | Amal |BBA
31-06-2015 |4 | chemistry|Jaya |BBA
31-06-2015 |5| science | Amal |BBA
仅为教员提供的预期输出:Amal
Datefdiff |hour|subject| batch |hour|subject | batch |faculty|hour | subject | batch | hour | subject | batch| hour | subject | batch |
----------+-------+----------+-------+-------+----------+-------+-------+----------+
30-06-2015| 1 | Maths| BBA| 2| Science | MBA | 3| Science | BBA| 4| chemistry| BBA | 5 |Physics |MBA
31-06-2015| 1 | Maths| BBA| 2| Science | MBA | 3| Science | BBA| 4| chemistry| BBA | 5 |Physics |MBA
这可能是表格设计的起点:
declare @tbFaculty table (
FacultyID int --identity(1,1) primary key
, Name varchar(50)
)
insert into @tbFaculty ( FacultyID, Name )
values ( 1, 'Kevin' )
, ( 2, 'Amal' )
declare @tbBatch table(
BatchID int --identity(1,1) primary key
, Name char(3)
)
insert into @tbBatch ( BatchID, Name )
values ( 1, 'BBA' )
, ( 2, 'MBA' )
declare @tbClass table (
[Hour] tinyint
, [Subject] nvarchar (128)
, [FacultyID] int
, [Attendence] bit
, [BatchID] char(3)
, [ClassDate] date
)
insert into @tbClass ( [Hour], [Subject], FacultyID, Attendence, BatchID, ClassDate )
values ( 1, 'Maths', 1, 1, 1, '2015-06-30' )
, ( 2, 'Maths', 1, 1, 1, '2015-06-30' )
, ( 3, 'Science', 2, 1, 1, '2015-06-30' )
, ( 1, 'Science', 2, 1, 2, '2015-06-30' )
, ( 2, 'Science', 2, 1, 2, '2015-06-30' )
, ( 3, 'Maths', 1, 1, 2, '2015-06-30' )
select
cl.ClassDate
, cl.[Hour]
, cl.[Subject]
, ba.Name as BatchName
, fa.Name as FacultyName
from
@tbClass cl
inner join @tbBatch ba on ba.BatchID = cl.BatchID
inner join @tbFaculty fa on fa.FacultyID = cl.FacultyID
where
fa.Name = 'Amal'
您还可以规范化主题。以下是如何规范化数据,这将使查询变得更加简单 使用您的表定义,我插入了您的数据
INSERT INTO test(Datedif,hour1,subject1,faculty1,hour2,subject2,faculty2,hour3,subject3,faculty3,batch)
VALUES ('30-06-2015',1,'Maths','Kevin',1,'Maths','Kevin',1,'Science','Amal','BBA'),
('30-06-2015',1,'Science','Amal',1,'Science','Amal',1,'Maths','Kevin','MBA');
然后,我为数据创建了一个新的规范化结构,其中包含更窄的数据类型。它有助于保持数据干净,并且不会浪费存储空间,这意味着查询将更快,因为它们不必处理太多数据
CREATE TABLE new_test
(
dt DATE NULL,
hr TINYINT NULL, --holds values between 0 to 255
subj VARCHAR(100) NULL, --plenty big enough. No need for NVARCHAR unless you are using Unicode characters
faculty VARCHAR(100) NULL,
attendance BIT NULL,
dayweek TINYINT NULL,
weekmonth TINYINT NULL,
section VARCHAR(100) NULL, --not sure what this is
sess VARCHAR(100) NULL, --not sure what this is
batch CHAR(3) NULL --looks like there are three character codes
);
这就是我规范化数据的地方。我不确定你是否有出席2、3、4等。。。如果您在实际表中这样做,那么您应该修复我的代码
注意:我计算了从日期开始的一周和一周。我做了我最好的猜测,如果他们是不正确的,那么请随意调整他们
WITH norm_data
AS
(
SELECT datedif,hour1,subject1,faculty1,attendence1,dayweek,weekmonth,section,[session],batch FROM test
UNION ALL
SELECT datedif,hour2,subject2,faculty2,attendence1,dayweek,weekmonth,section,[session],batch FROM test
UNION ALL
SELECT datedif,hour3,subject3,faculty3,attendence1,dayweek,weekmonth,section,[session],batch FROM test
UNION ALL
SELECT datedif,hour4,subject4,faculty4,attendence1,dayweek,weekmonth,section,[session],batch FROM test
UNION ALL
SELECT datedif,hour5,subject5,faculty5,attendence1,dayweek,weekmonth,section,[session],batch FROM test
)
INSERT INTO new_test
SELECT PARSE(datedif AS DATE USING 'de-DE') AS [datedif],
hour1,
subject1,
faculty1,
attendence1,
DATEPART(WEEKDAY,PARSE(datedif AS DATE USING 'de-DE')) AS dayweek,
datepart(day, datediff(day, 0, PARSE(datedif AS DATE USING 'de-DE'))/7 * 7)/7 + 1 AS weekmonth,
section,
[session],
batch
FROM norm_data
现在让我们看看你的新桌子
SELECT *
FROM new_test
如果正确,那么下面是如何重命名表
EXEC SP_rename @objname = 'test', --if you don't want to drop the old table
@newname = 'test_old'
EXEC SP_rename @objname = 'new_test', --now give the new table the actual name
@newname = 'test'
SELECT *
FROM test
我只想补充一下,这是一个单独的答案。试试这个:
--INSERT INTO dbo.test(datedif,[hour],[subject],faculty,batch)
--VALUES
--('30-06-2015',1,'Maths','Kevin','BBA'),
--('30-06-2015',2,'Science','Amal','MBA'),
--('30-06-2015',3,'chemistry','Jaya','BBA'),
--('30-06-2015',4,'chemistry','Jaya','BBA'),
--('30-06-2015',5,'chemistry','Jaya','BBA'),
--('31-06-2015',1,'science','Amal','BBA'),
--('31-06-2015',2,'Maths','kevin','BBA'),
--('31-06-2015',3,'Science','Amal','BBA'),
--('31-06-2015',4,'chemistry','Jaya','BBA'),
--('31-06-2015',5,'science','Amal','BBA');
WITH CTE_Hours
AS
(
SELECT
1 AS hour1,
MAX(CASE WHEN [Hour] = 1 THEN [subject] END) AS subject1,
MAX(CASE WHEN [Hour] = 1 THEN [batch] END) AS batch1 ,
2 AS hour2,
MAX(CASE WHEN [Hour] = 2 THEN [subject] END) AS subject2,
MAX(CASE WHEN [Hour] = 2 THEN [batch] END) AS batch2
--etc...
FROM dbo.test
WHERE faculty = 'Amal'
)
SELECT *
FROM (
SELECT DISTINCT datedif
FROM dbo.test
) A
CROSS JOIN CTE_Hours
那是个糟糕的桌子设计。您不应该为了模拟某些显示/表单而存储数据。应取消填充数据,以便所有数据(如
主题
数据)都在同一列中结束。然后添加一个可以存储数字1-5的额外列,并为该列指定一个名称,解释该数据所代表的内容(您当前错误地嵌入到表元数据中的数据)。谢谢您的建议,但如果我可以通过在where子句中使用该列来显示教员计划的详细信息,则会有所帮助,同时,我将尝试按照您的建议更改表定义。在更改表定义时,请记住日期值应存储在日期数据类型中,而nvarchar(max)用于超长unicode字符串。因为您的字符串看起来既短又简单,所以可以使用varchar(50)或任何其他适合您需要的长度。另外,我建议你规范化你的数据-有一个主题表,一个批次表,一个错误表等等。Nvarchar(max)-坏主意!!!您的表未正常化。修复你的数据库设计。我已根据你的建议更改了我的表。你可以在上面看到我更改的表。我如何加入它们并在网格视图中显示。请给我一些建议。像wise一样查看上面的网格视图我应该得到输出