在SQL Server中如何根据条件获取varchar值和数值
这是我的桌子在SQL Server中如何根据条件获取varchar值和数值,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,这是我的桌子 create table Marks_Entry ( id int, std_id varchar(50), sub_id varchar(50), ASG_MARK varchar(50), TH_MARKS varchar(50), PR_MARCHAR varchar(50) ) 此表包含如下值: id std_id sub_id ASG_MARK TH_MARKS PR_MARCHAR -----------
create table Marks_Entry
(
id int,
std_id varchar(50),
sub_id varchar(50),
ASG_MARK varchar(50),
TH_MARKS varchar(50),
PR_MARCHAR varchar(50)
)
此表包含如下值:
id std_id sub_id ASG_MARK TH_MARKS PR_MARCHAR
---------------------------------------------------
1 123 1 20 50 30
2 123 2 18 40 20
3 123 3 20 AB 30
4 123 4 AB 40 20
5 123 5 AB AB AB
6 123 6 0 0 0
我希望看到我的数据如下:
id std_id sub_id ASG_MARK TH_MARKS PR_MARCHAR total GRADE
-----------------------------------------------------------------
1 123 1 20 50 30 100 A1
2 123 2 20 0 30 50 F1
3 123 3 18 40 20 78 C1
4 123 4 AB 40 20 60 E1
5 123 5 AB AB AB AB AB
6 123 6 0 0 0 0 0
我的代码在下面,请查看任何一个并帮助我
select
id, STD_ID, SUB_ID, ASG_MARK, TH_MARKS, PR_MARCHAR,
(ASG_MARK + TH_MARKS + PR_MARCHAR ) as total,
CASE
WHEN (ASG_MARK + TH_MARKS + PR_MARCHAR) BETWEEN 91 AND 100
THEN 'A1'
WHEN (ASG_MARK + TH_MARKS + PR_MARCHAR) BETWEEN 81 AND 90
THEN 'B1'
WHEN (ASG_MARK + TH_MARKS + PR_MARCHAR) BETWEEN 71 AND 80
THEN 'C1'
WHEN (ASG_MARK + TH_MARKS + PR_MARCHAR) BETWEEN 61 AND 70
THEN 'D1'
WHEN (ASG_MARK + TH_MARKS + PR_MARCHAR) BETWEEN 51 AND 60
THEN 'E1'
WHEN (ASG_MARK + TH_MARKS + PR_MARCHAR) BETWEEN 41 AND 50
THEN 'F1'
ELSE 'AB'
END AS GRADE
from
(select
id, STD_ID, SUB_ID,
case ISNUMERIC(PR_MARCHAR)
when 1 then CAST(PR_MARCHAR as decimal)
else 0
end as PR_MARCHAR,
case ISNUMERIC(TH_MARKS)
when 1 then CAST(TH_MARKS as decimal)
else 0
end as TH_MARKS ,
case ISNUMERIC(ASG_MARK)
when 1 then CAST(ASG_MARK as decimal)
else 0
end as ASG_MARK
from
MARKS_ENTRY
group by
id, STD_ID, SUB_ID, ASG_MARK, TH_MARKS, PR_MARCHAR) MARKS
我建议您在学生缺席时存储NULL值而不是AB,而不是修复此查询
UPDATE Marks_Entry
SET ASG_MARK = NULL
WHERE ASG_MARK = 'AB'
UPDATE Marks_Entry
SET TH_MARKS = NULL
WHERE TH_MARKS = 'AB'
UPDATE Marks_Entry
SET PR_MARCHAR = NULL
WHERE PR_MARCHAR = 'AB'
更改ASG_标记、TH_标记和PR_MARCHAR列的数据类型
现在可以用更简单的方式编写查询
SELECT id,
STD_ID,
SUB_ID,
ASG_MARK = COALESCE(Cast(ASG_MARK as varchar(100)),'AB'),
TH_MARKS = COALESCE(Cast(TH_MARKS as varchar(100)),'AB'),
PR_MARCHAR = COALESCE(Cast(PR_MARCHAR as varchar(100)),'AB'),
TOTAL = CASE
WHEN ASG_MARK IS NULL AND TH_MARKS IS NULL AND PR_MARCHAR IS NULL THEN 'AB'
ELSE Cast(COALESCE(ASG_MARK, 0) + COALESCE(TH_MARKS, 0) + COALESCE(PR_MARCHAR, 0) AS VARCHAR(100))
END,
GRADE = CASE
WHEN orgTotal BETWEEN 91 AND 100 THEN 'A1'
WHEN orgTotal BETWEEN 81 AND 90 THEN 'B1'
WHEN orgTotal BETWEEN 71 AND 80 THEN 'C1'
WHEN orgTotal BETWEEN 61 AND 70 THEN 'D1'
WHEN orgTotal BETWEEN 51 AND 60 THEN 'E1'
WHEN orgTotal BETWEEN 41 AND 50 THEN 'F1'
WHEN orgTotal = 0 AND ABcheck <> 1 THEN '0'
ELSE 'AB'
END
FROM MARKS_ENTRY
CROSS apply (SELECT COALESCE(ASG_MARK, 0)+COALESCE(TH_MARKS, 0)+COALESCE(PR_MARCHAR, 0),
CASE
WHEN ASG_MARK IS NULL AND TH_MARKS IS NULL AND PR_MARCHAR IS NULL THEN 1 ELSE 0
END) tc (orgTotal, ABcheck)
AB在学生缺席时存储?先生,我想在所有三列ASG_MARK Thu MARK,PR_MARCHAR中显示AB,其中不需要为空values@NityanandVishwakarma-更新。。现在检查它工作正常,但一旦我再次更新任何表,它就会自动针对null插入零值。。。。现在我该怎么办??
SELECT id,
STD_ID,
SUB_ID,
ASG_MARK = COALESCE(Cast(ASG_MARK as varchar(100)),'AB'),
TH_MARKS = COALESCE(Cast(TH_MARKS as varchar(100)),'AB'),
PR_MARCHAR = COALESCE(Cast(PR_MARCHAR as varchar(100)),'AB'),
TOTAL = CASE
WHEN ASG_MARK IS NULL AND TH_MARKS IS NULL AND PR_MARCHAR IS NULL THEN 'AB'
ELSE Cast(COALESCE(ASG_MARK, 0) + COALESCE(TH_MARKS, 0) + COALESCE(PR_MARCHAR, 0) AS VARCHAR(100))
END,
GRADE = CASE
WHEN orgTotal BETWEEN 91 AND 100 THEN 'A1'
WHEN orgTotal BETWEEN 81 AND 90 THEN 'B1'
WHEN orgTotal BETWEEN 71 AND 80 THEN 'C1'
WHEN orgTotal BETWEEN 61 AND 70 THEN 'D1'
WHEN orgTotal BETWEEN 51 AND 60 THEN 'E1'
WHEN orgTotal BETWEEN 41 AND 50 THEN 'F1'
WHEN orgTotal = 0 AND ABcheck <> 1 THEN '0'
ELSE 'AB'
END
FROM MARKS_ENTRY
CROSS apply (SELECT COALESCE(ASG_MARK, 0)+COALESCE(TH_MARKS, 0)+COALESCE(PR_MARCHAR, 0),
CASE
WHEN ASG_MARK IS NULL AND TH_MARKS IS NULL AND PR_MARCHAR IS NULL THEN 1 ELSE 0
END) tc (orgTotal, ABcheck)