;WITH CTE_NIVEL_ENSINO_CONTAGEM_DE_ESCOLA AS (
SELECT CODIGO_ESCOLA, COUNT(CODIGO_NIVEL_ENSINO) AS NIVEL_ENSINO_CONTAGEM_DE_ESCOLA
FROM ESCOLA_NIVELENSINO
GROUP BY CODIGO_ESCOLA
)
UPDATE e
SET e.Level = CASE WHEN c.NIVEL_ENSINO_CONTAGEM_DE_ESCOLA >= 3 THEN 'A' WHEN c.NIVEL_ENSINO_CONTAGEM_DE_ESCOLA = 2 THEN 'B' ELSE 'C' END
FROM ESCOLA AS e
INNER JOIN CTE_NIVEL_ENSINO_CONTAGEM_DE_ESCOLA AS c
ON e.CODIGO_ESCOLA = c.CODIGO_ESCOLA;
SELECT * FROM ESCOLA;
Create a cursor that update field type char value in Sql Server
Hello , i want create a cursor that update column of my table Schools with more than three levels of education are level A,
Schools with two levels of education are leveled with category B and other schools are leveled with category C.
I tried to do it in other ways but I stopped here:
BEGIN TRANSACTION
DECLARE @CODIGO_ESCOLA INT
DECLARE @DESCRICAO VARCHAR(50)
DECLARE @CODIGO_CIDADE INT
DECLARE @NIVEL CHAR(1)
DECLARE CURSOR_ATIVIDADE_INTEGRADORA CURSOR FOR
SELECT
CODIGO_ESCOLA,
DESCRICAO,
CODIGO_CIDADE,
NIVEL
FROM ESCOLA
OPEN CURSOR_ATIVIDADE_INTEGRADORA
FETCH NEXT FROM CURSOR_ATIVIDADE_INTEGRADORA INTO
@CODIGO_ESCOLA, @DESCRICAO, @CODIGO_CIDADE, @NIVEL
WHILE @@Fetch _STATUS = 0
BEGIN
DECLARE CURSOR_COD_ESCOLA_ENSINO CURSOR FOR
SELECT ENV.CODIGO_NIVEL_ENSINO
FROM ESCOLA_NIVELENSINO ENV
INNER JOIN ESCOLA E
ON ENV.CODIGO_ESCOLA = E.CODIGO_ESCOLA
OPEN CURSOR_COD_ESCOLA_ENSINO
IF @CODIGO_NIVEL_ENSINO < 3
UPDATE ESCOLA
SET NIVEL = @NIVEL
WHERE CODIGO_NIVEL_ENSINO = @CODIGO_NIVEL_ENSINO
ELSE
IF @CODIGO_NIVEL_ENSINO >= 3 AND @CODIGO_NIVEL_ENSINO <=4
UPDATE ESCOLA
SET NIVEL = @NIVEL
WHERE CODIGO_NIVEL_ENSINO = @CODIGO_NIVEL_ENSINO
ELSE
UPDATE ESCOLA
SET NIVEL = @nivel
WHERE CODIGO_NIVEL_ENSINO = @CODIGO_NIVEL_ENSINO
FETCH NEXT FROM CURSOR_EXERCICIO_GRUPO INTO
@CODIGO, @nome , @VALOR, @ESTOQUE
END
CLOSE CURSOR_ATIVIDADE_INTEGRADORA
DEALLOCATE CURSOR_ATIVIDADE_INTEGRADORA
SELECT * FROM ESCOLA
ROLLBACK
My tables in database there are:
CREATE TABLE ESCOLA
(
CODIGO_ESCOLA BIGINT NOT NULL,
DESCRICAO VARCHAR(50),
CODIGO_CIDADE BIGINT,
CONSTRAINT PK_CODIGO_ESCOLA PRIMARY KEY(CODIGO_ESCOLA),
CONSTRAINT FK_CIDADE FOREIGN KEY(CODIGO_CIDADE) REFERENCES CIDADE(CODIGO_CIDADE)
)
CREATE TABLE ESCOLA_NIVELENSINO
(
CODIGO_ESCOLA BIGINT,
CODIGO_NIVEL_ENSINO BIGINT,
CONSTRAINT PK_CODESCOLA_CODNVENSINO PRIMARY KEY(CODIGO_ESCOLA, CODIGO_NIVEL_ENSINO),
CONSTRAINT FK_CODIGO_ESCOLA FOREIGN KEY(CODIGO_ESCOLA) REFERENCES ESCOLA(CODIGO_ESCOLA),
CONSTRAINT FK_CODIGO_NIVEL_ENSINO FOREIGN KEY(CODIGO_NIVEL_ENSINO) REFERENCES NIVEL_ENSINO(CODIGO_NIVEL_ENSINO)
)
CREATE TABLE NIVEL_ENSINO
(
CODIGO_NIVEL_ENSINO BIGINT NOT NULL,
DESCRICAO VARCHAR(50),
CONSTRAINT PK_NIVEL_ENSINO PRIMARY KEY(CODIGO_NIVEL_ENSINO)
)
The inserts values:
INSERT INTO NIVEL_ENSINO VALUES
(1,'Ensino fundamental'),
(2,'Ensino Médio'),
(3,'Ensino Técnico'),
(4,'Ensino Superior')
INSERT INTO ESCOLA VALUES
(1, 'ufrj ', 1),
(2, 'ufrgs ', 4),
(3, 'USP ', 3),
(4, 'Escolinha do Professor Raimundo', 10),
(5, 'Escola do Rock', 7)
INSERT INTO ESCOLA_NIVELENSINO VALUES
(1, 3),
(1, 4),
(2, 3),
(2, 4),
(3, 3),
(4, 1),
(4, 2),
(4, 3),
(5, 1),
(5, 2)
Developer technologies | Transact-SQL
SQL Server | Other
-
Guoxiong 8,206 Reputation points
2020-08-25T17:54:24.64+00:00
1 additional answer
Sort by: Most helpful
-
MelissaMa-MSFT 24,221 Reputation points
2020-08-25T02:14:26.01+00:00 Hi @jonathas moura ,
What is your expected output?
Per my understanding, it is not neccessary to use cursor to update the field.
Please refer below query and modify it accordingly.
DROP TABLE IF EXISTS #TABLE ;WITH CTE AS ( select CODIGO_ESCOLA, ROW_NUMBER() OVER (PARTITION BY CODIGO_ESCOLA ORDER BY CODIGO_ESCOLA DESC) AS RN from ESCOLA_NIVELENSINO) SELECT CODIGO_ESCOLA, MAX(RN) RN INTO #TABLE FROM CTE GROUP BY CODIGO_ESCOLA UPDATE A SET NIVEL=CASE WHEN B.RN>=3 THEN 'A' WHEN B.RN=2 THEN 'B' ELSE 'C' END FROM ESCOLA A INNER JOIN #TABLE B ON A.CODIGO_ESCOLA=B.CODIGO_ESCOLA select * from ESCOLA
If the response is helpful, please click "Accept Answer" and upvote it.
Best regards
Melissa