4
Speaking of variables that can be declared within the begin
, I saw that you have Declare e set only that I don’t know when to use them. I saw that you have set @x
, set x
, set x = x+1
, set x := x+1
; they all confuse me and I don’t know what they’re for.
I have this code that is to get the code of the product that each customer more bought. I wanted him to take the first client of each code and show it, because I ordered it down.
You’re leaving as follows: product name, code Product, client, qtdComprada;
ABAJUR 15 JOSE TAVARES DE OLUVEIRA 2
LAPISEIRA 1.2 10 JOSE TAVARES DE OLUVEIRA 1
CAIXA DE SOM 16 JOSE TAVARES DE OLUVEIRA 1
CANETA VERMELHA 3 MANOEL JOAQUIM PURTUGA 2
LAPISEIRA 0.9 9 MANOEL JOAQUIM PURTUGA 1
I wanted to show the first line of each customer.
/*Crie uma store procedure que informe o produto mais comprado de cada cliente*/
DELIMITER $$
DROP PROCEDURE IF EXISTS uspProdutoMaisCompradoCliente $$
CREATE PROCEDURE uspProdutoMaisCompradoCliente ()
BEGIN
DECLARE done BOOLEAN DEFAULT FALSE;
DECLARE vNomeProd VARCHAR(250);
DECLARE vNomeCli VARCHAR(250);
DECLARE vQtdComprProd INT(11);
DECLARE contador int;
DECLARE cursor_a CURSOR FOR (
select produto.nome as nomeProd, cliente.nome as cliente,
count(produto.codigo) as qtdComprProd
from cliente
inner join nota_fiscal
on cliente.codigo = nota_fiscal.cod_cliente
inner join item_nota_fiscal
on item_nota_fiscal.numero_nf = nota_fiscal.numero_nf
inner join produto
on produto.codigo = item_nota_fiscal.cod_produto
group by produto.nome , produto.codigo , cliente.nome , cliente.codigo
order by cliente.nome, qtdComprProd desc
);
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = TRUE;
DROP TEMPORARY TABLE IF EXISTS tempTabela;
CREATE TEMPORARY TABLE tempTabela (
tNomeProd VARCHAR(250),
tNomeCli VARCHAR(250),
tQtdComprProd INT(11)
);
OPEN cursor_a;
REPEAT
FETCH cursor_a INTO vNomeProd,vNomeCli, vQtdComprProd;
IF NOT done THEN
INSERT INTO tempTabela VALUES (vNomeProd, vNomeCli, vQtdComprProd);
END IF;
UNTIL done END REPEAT;
close cursor_a;
SELECT * FROM tempTabela;
END $$
DELIMITER ;
`tabelas`:
`CREATE TABLE ESTADO (
ESTADO VARCHAR(02) NOT NULL,
NOME VARCHAR(100) NOT NULL,
PRIMARY KEY (ESTADO)
) ;`
`CREATE TABLE CIDADE (
CODIGO INTEGER NOT NULL,
NOME VARCHAR(250) NOT NULL,
ESTADO VARCHAR(02),
PRIMARY KEY (CODIGO),
FOREIGN KEY (ESTADO) REFERENCES ESTADO (ESTADO)
) ;`
`CREATE TABLE CLIENTE (
CODIGO INT NOT NULL AUTO_INCREMENT,
NOME VARCHAR(250) NOT NULL,
RUA VARCHAR(250),
NUMERO VARCHAR(10),
COD_CIDADE INTEGER,
PRIMARY KEY (CODIGO),
FOREIGN KEY (COD_CIDADE) REFERENCES CIDADE (CODIGO)
);`
`CREATE TABLE FORNECEDOR (
CODIGO INTEGER NOT NULL,
NOME VARCHAR(250) NOT NULL,
RUA VARCHAR(250),
NUMERO VARCHAR(10),
COD_CIDADE INTEGER,
PRIMARY KEY (CODIGO),
FOREIGN KEY (COD_CIDADE) REFERENCES CIDADE (CODIGO)
);`
`CREATE TABLE PRODUTO (
CODIGO INTEGER NOT NULL,
NOME VARCHAR(250) NOT NULL,
PCO_ATUAL_CPA DECIMAL(10,2),
PCO_ATUAL_VDA DECIMAL(10,2),
QTD_ESTOQUE INTEGER,
QTD_EST_MIN INTEGER,
QTD_EST_MAX INTEGER,
QTD_PTO_CPA INTEGER,
IDF_ATIVO_SN VARCHAR(01) DEFAULT 'S',
COD_FORNECEDOR INTEGER,
PRIMARY KEY (CODIGO),
FOREIGN KEY (COD_FORNECEDOR) REFERENCES FORNECEDOR (CODIGO)
) ;`
`CREATE TABLE NOTA_FISCAL (
NUMERO_NF INTEGER NOT NULL,
DTA_VENDA DATE NOT NULL,
COD_CLIENTE INTEGER,
VALOR_TOTAL DECIMAL(10,2),
PRIMARY KEY (NUMERO_NF),
FOREIGN KEY (COD_CLIENTE) REFERENCES CLIENTE (CODIGO)
) ;`
`CREATE TABLE ITEM_NOTA_FISCAL (
NUMERO_NF INTEGER NOT NULL,
COD_PRODUTO INTEGER NOT NULL,
QTD_VEDIDA INTEGER,
PCO_RECEBIDO DECIMAL(10,2),
PRIMARY KEY (NUMERO_NF, COD_PRODUTO),
FOREIGN KEY (NUMERO_NF) REFERENCES NOTA_FISCAL (NUMERO_NF),
FOREIGN KEY (COD_PRODUTO) REFERENCES PRODUTO (CODIGO)
) ;`
If your requirement is just that:
pegar o código do produto que cada cliente mais comprou
you are using an Overkill to solve the problem, a query simulating theROW_NUMBER() over
solves your problem. To do this I need only know your data and the structure of your tables.– Jorge Campos
I have to take: LAMP 15 JOSE TAVARES DE OLUVEIRA 2 RED PEN 3 MANOEL JOAQUIM PURTUGA 2 ie , the first customer with his data, because only then will I have access to the most purchased product of each customer
– Gabriella
Please add the structure of the tables involved with the data! Only then can I make a query that returns what you expect. The data you show in the question seems to come from the query joins in the Past.
– Jorge Campos
Okay, I’ll do that. Obg
– Gabriella