quarta-feira, 6 de junho de 2007

Banco de dados Exercício 2



a) Selecionar a placa do veículo e o nome do proprietário para os veículos que tiveram
infrações do tipo “GRAVE” no ano de 2003.

SELECT V.PLACA, P.NOME
FROM R9_VEICULO V, R9_PROPRIETARIO P, R9_INFRACAO_VEICULO IV, R9_INFRACAO I, R9_TIPOINFRACAO T
WHERE V.PLACA = IV.PLACA AND P.CPF = V.CPFPROP AND I.CODIGO = IV.CODINFRACAO AND
T.CODIGO = I.CODTIPO AND T.DESCTIPO = 'GRAVE' AND TO_CHAR(IV.DATA, 'YYYY') = '2003';

b) Selecionar o nome do proprietário e o valor total de suas multas, para os proprietários
cujo valor total das multas seja superior a R$1000,00.

SELECT P.NOME, SUM(IV.VALOR) AS VALORTOTAL
FROM R9_PROPRIETARIO P, R9_INFRACAO_VEICULO IV, R9_VEICULO V
WHERE P.CPF = V.CPFPROP AND V.PLACA = IV.PLACA
GROUP BY P.NOME
HAVING SUM(IV.VALOR) > 1000;

c) Selecionar o(s) nome(s) do(s) proprietário(s) que possui(em) o valor total máximo de
multas.

SELECT P.NOME
FROM R9_PROPRIETARIO P, R9_VEICULO V, R9_INFRACAO_VEICULO IV
WHERE P.CPF = V.CPFPROP AND V.PLACA = IV.PLACA
GROUP BY P.NOME
HAVING SUM(IV.VALOR) = (SELECT MAX(TOTAL)
FROM ( SELECT SUM(IV.VALOR) TOTAL
FROM R9_INFRACAO_VEICULO IV, R9_PROPRIETARIO P, R9_VEICULO V
WHERE P.CPF = V.CPFPROP AND V.PLACA = IV.PLACA
GROUP BY P.NOME));

d) Selecionar o nome dos proprietários que não cometeram infrações graves nos últimos 3
anos.

SELECT P.NOME
FROM R9_PROPRIETARIO P
MINUS
SELECT P.NOME
FROM R9_VEICULO V, R9_PROPRIETARIO P, R9_INFRACAO_VEICULO IV, R9_INFRACAO I, R9_TIPOINFRACAO T
WHERE V.PLACA = IV.PLACA AND
P.CPF = V.CPFPROP AND I.CODIGO = IV.CODINFRACAO AND
T.CODIGO = I.CODTIPO AND T.DESCTIPO = 'GRAVE' AND
MONTHS_BETWEEN(SYSDATE, IV.DATA) < 36;

e) Selecionar a placa dos veículos cujos proprietários sejam de “BELO HORIZONTE” e que não tenham infrações no ano de 2003.

SELECT V.PLACA FROM R9_VEICULO V MINUS SELECT V.PLACA
FROM R9_VEICULO V, R9_PROPRIETARIO P, R9_INFRACAO_VEICULO IV, R9_INFRACAO I WHERE V.PLACA = IV.PLACA AND P.CPF = V.CPFPROP AND I.CODIGO = IV.CODINFRACAO AND P.CIDADE = 'BELO HORIZONTE' AND TO_CHAR(IV.DATA, 'YYYY') = '2003';

f) Selecionar a descrição das infrações do tipo “LEVE” que foram cometidas pelo menos 2 vezes no ano de 2003.

SELECT I.DESCINFRACAO FROM R9_INFRACAO I, R9_INFRACAO_VEICULO IV, R9_TIPOINFRACAO T WHERE I.CODIGO = IV.CODINFRACAO AND T.CODIGO = I.CODTIPO AND T.DESCTIPO = 'LEVE' AND TO_CHAR(IV.DATA, 'YYYY') = '2003' GROUP BY I.DESCINFRACAO HAVING COUNT(*)>=2;

g) Selecionar a placa, a cor, e o ano dos veículos emplacados em “BELO HORIZONTE”
ou que não cometeram infrações em 2003.

SELECT V.PLACA, V.COR, V.ANO
FROM R9_VEICULO V, R9_INFRACAO_VEICULO IV, R9_INFRACAO I, R9_PROPRIETARIO P
WHERE P.CPF = V.CPFPROP AND
V.PLACA = IV.PLACA AND I.CODIGO = IV.CODINFRACAO AND
P.CIDADE = 'BELO HORIZONTE' OR (TO_CHAR(IV.DATA, 'YYYY') <> '2003');

h) Selecionar o nome dos proprietários que cometeram pelo menos uma infração, mas que
não cometeram infrações do tipo “GRAVISSIMA”.

SELECT DISTINCT P.NOME
FROM R9_VEICULO V, R9_PROPRIETARIO P, R9_INFRACAO I, R9_TIPOINFRACAO TI, R9_INFRACAO_VEICULO IV
WHERE P.CPF = V.CPFPROP AND
V.PLACA = IV.PLACA AND IV.CODINFRACAO = I.CODIGO AND I.CODTIPO = TI.CODIGO
MINUS
SELECT P.NOME
FROM R9_VEICULO V, R9_PROPRIETARIO P, R9_INFRACAO I, R9_TIPOINFRACAO TI, R9_INFRACAO_VEICULO IV
WHERE P.CPF = V.CPFPROP AND
V.PLACA = IV.PLACA AND IV.CODINFRACAO = I.CODIGO AND
I.CODTIPO = TI.CODIGO AND TI.DESCTIPO = 'GRAVISSIMA';

i) Selecionar a placa do veículo, o nome do proprietário, e a data da infração para as
infrações cuja pontuação seja superior a 5 pontos.

SELECT V.PLACA, P.NOME, IV.DATA
FROM R9_VEICULO V, R9_PROPRIETARIO P, R9_INFRACAO I, R9_TIPOINFRACAO TI, R9_INFRACAO_VEICULO IV
WHERE P.CPF = V.CPFPROP AND
V.PLACA = IV.PLACA AND IV.CODINFRACAO = I.CODIGO AND
I.CODTIPO = TI.CODIGO AND TI.PONTUACAO > 5;

j) Selecionar o nome dos proprietários que cometeram pelo menos uma infração, mas cujo valor total de suas infrações não ultrapasse R$600,00.

SELECT P.NOME
from R9_PROPRIETARIO P, R9_VEICULO V, R9_INFRACAO_VEICULO IV
WHERE P.CPF = V.CPFPROP
AND V.PLACA = IV.PLACA
GROUP BY P.NOME
HAVING SUM(IV.VALOR) < 600;

Nenhum comentário:

Postar um comentário