автоматизировать процесс добавления меток обновления в каждом предмете на основе конкретных условий - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть таблица с заданными значениями. Это только примерная таблица, моя настоящая история содержит 15 столбцов и содержит более 1000 строк данных.

CREATE TABLE TEMP_GRACE
(
    SYM NVARCHAR(2),
    ENG NVARCHAR(2),
    MATHS NVARCHAR(2),
    SCIENCE NVARCHAR(2),
    GEO NVARCHAR(2)
);
insert into temp_grace values ('1','28','5','10','5');
insert into temp_grace values ('2','50','25','30','20');
insert into temp_grace values ('3','15','10','25','20');
insert into temp_grace values ('4','90','95','98','90');
insert into temp_grace values ('5','90','88','25','87');

По каждому предмету проходной балл равен 30. Мне нужно подсчитать, сколько НОМЕР ОБНОВЛЕНИЯ следует добавить к каждому предметному знаку, чтобы получить 30, а затем получить сумму такого НОМЕР ОБНОВЛЕНИЯ [TTL_UPGRADE] для каждого номера символа.

Я должен добавить требуемый НОМЕР ОБНОВЛЕНИЯ к предметам, если общее НОМЕР ОБНОВЛЕНИЯ составляет менее 60 для каждой строки.

Я сделал запрос SELECT для этого условия, но я понятия не имею, как я могу add/update требовать НОМЕР ОБНОВЛЕНИЯ для каждого предмета.

WITH CTE AS
(
    SELECT 
        SYM, 
        ENG,
        CASE WHEN A.ENG <> 'AB' AND TRY_CONVERT(NUMERIC(38, 2), A.ENG) < 30.00  
                THEN 30.00 - TRY_CONVERT(NUMERIC(38, 2), A.ENG)
        ELSE 100 END AS [UP_ENG]
        ,MATHS 
        ,CASE WHEN A.MATHS <> 'AB' AND TRY_CONVERT(NUMERIC(38, 2), A.MATHS) < 30.00  
                THEN 30.00 - TRY_CONVERT(NUMERIC(38, 2), A.MATHS)
        ELSE 100 END AS [UP_MATHS]
        ,SCIENCE
        ,CASE WHEN A.SCIENCE <> 'AB' AND TRY_CONVERT(NUMERIC(38, 2), A.SCIENCE) < 30.00  
                THEN 30.00 - TRY_CONVERT(NUMERIC(38, 2), A.SCIENCE)
        ELSE 100 END AS [UP_SCIENCE]
        ,GEO
        ,CASE WHEN A.GEO <> 'AB' AND TRY_CONVERT(NUMERIC(38, 2), A.GEO) < 30.00  
                THEN 30.00 - TRY_CONVERT(NUMERIC(38, 2), A.GEO)
        ELSE 100 END AS [UP_GEO]
        ,(
            (CASE WHEN A.ENG <> 'AB' AND TRY_CONVERT(NUMERIC(38, 2), A.ENG) < 30.00  
                THEN 30.00 - TRY_CONVERT(NUMERIC(38, 2), A.ENG)
            ELSE 0 END) +
            (CASE WHEN A.MATHS <> 'AB' AND TRY_CONVERT(NUMERIC(38, 2), A.MATHS) < 30.00  
                THEN 30.00 - TRY_CONVERT(NUMERIC(38, 2), A.MATHS)
            ELSE 0 END) +
            (CASE WHEN A.SCIENCE <> 'AB' AND TRY_CONVERT(NUMERIC(38, 2), A.SCIENCE) < 30.00  
                THEN 30.00 - TRY_CONVERT(NUMERIC(38, 2), A.SCIENCE)
            ELSE 0 END) +
            (CASE WHEN A.GEO <> 'AB' AND TRY_CONVERT(NUMERIC(38, 2), A.GEO) < 30.00  
                THEN 30.00 - TRY_CONVERT(NUMERIC(38, 2), A.GEO)
            ELSE 0 END)
        ) AS [TTL_UPGRADE]
    FROM [DBO].[TEMP_GRACE] A       
)
SELECT SYM, ENG, UP_ENG, MATHS, UP_MATHS, SCIENCE, UP_SCIENCE, GEO, UP_GEO, TTL_UPGRADE FROM CTE 
WHERE TTL_UPGRADE < 60 AND TTL_UPGRADE > 0 ORDER BY TTL_UPGRADE DESC;

Основываясь на запросе фильтра выше, я должен добавить UPGRADE NUMBER к 3 из sym строк. Теперь, как обновить такие строки?

SYM ENG UP_ENG  MATHS   UP_MATHS    SCIENCE UP_SCIENCE  GEO UP_GEO  TTL_UPGRADE
3   15  15.00   10      20.00       25      5.00        20  10.00   50.00
2   50  100.00  25      5.00        30      100.00      20  10.00   15.00
5   90  100.00  88      100.00      25      5.00        87  100.00  5.00

В первом ряду я должен добавить 15 в ENG, 20 в MATHS, 5 в НАУКЕ и 10 в GEO, аналогично для второго ряда я должен добавить 5 в MATHS, 10 в GEO и для третьего ряда я должен добавить 5 в НАУКЕ.

1 Ответ

0 голосов
/ 11 апреля 2019

Вы можете достичь этого, используя несколько таблиц CTE.В приведенной ниже таблице запросов Marks рассчитываются обязательные оценки, если оценки не превышают 30 по каждому предмету.таблица Total_Upgrade_Number вычисляет total_marks и проверяет, являются ли номера улучшенных номеров меньше 60. таблица Add_upgrade_numbers добавляет требуемые ОБНОВЛЕНИЯ НОМЕР к каждому предмету.

Запрос

 With Marks as
 (
select SYM,
       TEMP_GRACE.eng,  case when  TEMP_GRACE.eng  <30 then  30 - TEMP_GRACE.eng else 0 end eng_required_marks ,
       TEMP_GRACE.maths, case when  TEMP_GRACE.maths <30 then  30 - TEMP_GRACE.maths else 0 end math_required_marks,
       TEMP_GRACE.SCIENCE, case when  TEMP_GRACE.SCIENCE <30 then  30 - TEMP_GRACE.SCIENCE else 0 end SCIENCE_required_marks ,
       TEMP_GRACE.GEO, case when  TEMP_GRACE.GEO <30 then  30 - TEMP_GRACE.GEO else 0 end GEO_required_marks 
from TEMP_GRACE),
Total_Upgrade_Number As
 ( select SYM, sum(eng_required_marks + math_required_marks + SCIENCE_required_marks + SCIENCE_required_marks + GEO_required_marks) total_marks
   from  Marks
   group by SYM 
   having sum(eng_required_marks + math_required_marks + SCIENCE_required_marks + SCIENCE_required_marks + GEO_required_marks) >  0 and
          sum(eng_required_marks + math_required_marks + SCIENCE_required_marks + SCIENCE_required_marks + GEO_required_marks) < 60

 ),
 Add_upgrade_numbers AS
 ( select marks.*, Total_Upgrade_Number.total_marks
   from marks
   inner join Total_Upgrade_Number on marks.sym = Total_Upgrade_Number.sym
 )
 select SYM, total_marks "total_marks_less_than_60" ,
         eng, eng_required_marks ,
        case when eng >0 and eng < 30 then eng+ eng_required_marks else eng end "English",
        maths,math_required_marks , 
        case when maths >0 and maths <30 then maths+math_required_marks else maths end "math", 
        SCIENCE , SCIENCE_required_marks ,
        case when SCIENCE>0 and SCIENCE <30 then SCIENCE + SCIENCE_required_marks else SCIENCE end "SCIENCE", 
        GEO,GEO_required_marks ,
        case when Geo > 0 and geo < 30 then  GEO+GEO_required_marks else geo end "Geo"       
 from Add_upgrade_numbers

Выход

enter image description here

...