Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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 Server中如何根据条件获取varchar值和数值_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

在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)