Advertisement
Kimossab

BD - Prova Exemplo 2017

Jun 19th, 2017
498
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 12.20 KB | None | 0 0
  1. /* III */
  2. /* a) */
  3. (SELECT TOP(5) Nome_cliente, Nif, COUNT(*) AS [Quantidade], '+contas', NULL AS [Ano]
  4.     FROM d_Clientes JOIN d_Contas_clientes
  5.         ON d_Clientes.N_cliente = d_Contas_clientes.N_cliente
  6.     GROUP BY d_Contas_clientes.N_cliente
  7.     ORDER BY Quantidade DESC)
  8.  
  9. UNION
  10.    
  11. (SELECT TOP(5) Nome_cliente, Nif, COUNT(*) AS [Quantidade], '+movimentos', DATEPART(YEAR,d_Historico_Movimentos.DATA) AS [ANO]
  12.     FROM d_Clientes JOIN d_Contas_clientes
  13.         ON d_Clientes.N_cliente = d_Contas_clientes.N_cliente JOIN d_Contas
  14.             ON d_Contas_clientes.N_Conta = d_Historico_Movimentos.N_Conta
  15.     WHERE (DATEDIFF(YEAR, d_Historico_Movimentos.DATA, getdate()) = -1
  16.             OR DATEDIFF(YEAR, d_Historico_Movimentos.DATA, getdate()) = 0)
  17.         AND DATEDIFF(MONTH, d_Historico_Movimentos.DATA, getdate()) = 0
  18.     GROUP BY d_Contas_clientes.N_cliente, DATEPART(MONTH,d_Historico_Movimentos.DATA)
  19.     ORDER BY Quantidade DESC);
  20.    
  21. /* b) */
  22. UPDATE d_Clientes SET VariosBalcoes = TRUE
  23.     WHERE N_cliente IN (SELECT N_cliente FROM d_Contas_clientes JOIN d_Contas
  24.             ON d_Contas.N_Conta = d_Contas_clientes.N_Conta JOIN d_Balcoes
  25.                 ON d_Contas.N_balcao = d_Balcoes.N_balcao
  26.         GROUP BY d_Contas_clientes.N_Cliente, d_Balcoes.codigo
  27.         HAVING COUNT(*) > 1)
  28.    
  29. /* c) */
  30. SELECT N_Cliente, Nif FROM
  31.     (SELECT N_Cliente, Nif FROM (
  32.         SELECT d_clientes.N_Cliente
  33.             FROM d_Clientes,  d_bancos.Codigo
  34.                 JOIN d_contas_clientes ON d_clientes.N_Cliente = d_contas_clientes.N_cliente
  35.                 JOIN d_contas ON d_contas.N_conta = d_contas_clientes.N_conta
  36.                 JOIN d_bancos ON d_bancos.Codigo = d_contas.Codigo
  37.             GROUP BY d_Contas_Clientes.N_Cliente, d_bancos.Codigo) AS sub
  38.         GROUP BY sub.n_cliente
  39.         HAVING  COUNT(*) = (SELECT COUNT(*) FROM d_bancos)) AS temp1
  40.    
  41.     JOIN
  42.     (SELECT N_Cliente FROM (
  43.     SELECT d_clientes.N_Cliente
  44.         FROM d_Clientes
  45.             JOIN d_emprestimos_clientes ON d_clientes.N_Cliente = d_emprestimos_clientes.N_cliente
  46.             JOIN d_emprestimos ON d_emprestimos_clientes.N_emprestimo = d_emprestimos.N_emprestimo
  47.             JOIN d_bancos ON d_bancos.Codigo = d_emprestimos.Codigo
  48.         GROUP BY d_clientes.N_Cliente,d_bancos.Codigo) AS sub
  49.     GROUP BY sub.n_cliente
  50.     HAVING  COUNT(*) = (SELECT COUNT(*) FROM d_bancos)) AS temp2
  51.    
  52.     ON temp1.N_Cliente = temp2.N_Cliente
  53.    
  54.    
  55. /* IV */
  56. /* a) */
  57. CREATE TRIGGER OnInsertMov
  58. ON d_Movimentos
  59. INSTEAD OF INSERT
  60. AS
  61. BEGIN
  62.         DECLARE @Opsuc BIT = 0
  63.         IF (SELECT COUNT(*) FROM INSERTED) == 1
  64.         BEGIN
  65.                 DECLARE @Nmov INT,
  66.                         @NCon INT,
  67.                         @Tipo CHAR,
  68.                         @Val MONEY,
  69.                         @DATA DATE
  70.        
  71.                 SELECT @Nmov = N_movimento,
  72.                         @NCon = N_conta,
  73.                         @Tipo = Tipo,
  74.                         @Val = Valor,
  75.                         @DATA = DATA
  76.                 FROM INSERTED
  77.                
  78.                 IF Tipo = 'L' /*Levantamentos*/
  79.                 BEGIN
  80.                         IF @Val > (SELECT Saldo FROM d_Contas c JOIN d_Movimentos m
  81.                                         ON c.N_conta = m.N_conta
  82.                                         WHERE(c.N_conta = @NCon)) /*Se não tiver saldo*/
  83.                         BEGIN
  84.                                 IF (SELECT * FROM d_Contas WHERE N_conta = @NCon*10) != NULL /*se existir*/
  85.                                 BEGIN
  86.                                         INSERT INTO d_Movimentos VALUES (@NCon*10,@Tipo,@Val,@DATA)
  87.                                         UPDATE d_Contas SET Saldo = Saldo-@Val WHERE N_conta = @NCon*10
  88.                                         SET @Opsuc = 1
  89.                                         PRINT 'Foi retirado o valor da transação à sua conta a prazo'
  90.                                 END
  91.                                 ELSE
  92.                                 BEGIN
  93.                                         INSERT INTO Falhas_lev VALUES (@NCon,@DATA,@Val)
  94.                                         IF @Val > 400
  95.                                                 INSERT INTO Alertas VALUES (@NCon,@DATA,@Val)
  96.                                 ELSE
  97.                         END
  98.                         ELSE
  99.                         BEGIN
  100.                                 INSERT INTO d_Movimentos VALUES (@NCon,@Tipo,@Val,@DATA)
  101.                                 UPDATE d_Contas SET Saldo = Saldo-@Val WHERE N_conta = @NCon
  102.                                 SET @Opsuc = 1
  103.                         END
  104.                 END
  105.                 ELSE/*Depositos*/
  106.                         INSERT INTO d_Movimentos VALUES (@NCon,@Tipo,@Val,@DATA)
  107.                         UPDATE d_Contas SET Saldo = Saldo+@Val WHERE N_conta = @NCon
  108.                         SET @Opsuc = 1
  109.                 BEGIN
  110.                 END
  111.         END
  112.         ELSE
  113.                 RAISERROR('Apenas um movimento por favor.',11,1)
  114.  
  115.         IF @Opsuc = 0
  116.                 PRINT 'OPERAÇÃO SEM SUCESSO'
  117.         ELSE PRINT 'OPERAÇÃO COM SUCESSO'
  118. END
  119.  
  120. /* b) */
  121. CREATE PROCEDURE ListMov
  122.         @NC INT
  123. AS
  124. BEGIN
  125.         DECLARE @Tot INT = 0,
  126.                 @NumM INT,
  127.                 @DATA DATE,
  128.                 @Val MONEY,
  129.                 @Tipo CHAR
  130.  
  131.         PRINT 'Número de Movimento - Data - Valor'
  132.        
  133.         DECLARE C_Mov CURSOR
  134.         FOR (SELECT TOP 10 N_movimento, DATA, Valor, Tipo FROM d_Movimentos WHERE N_conta = @NC OREDER BY DATA DESC)
  135.         OPEN C_Mov
  136.         FETCH FIRST FROM C_Mov INTO @NumM, @DATA, @Val, @Tipo
  137.         WHILE @@FETCH_STATUS = 0
  138.         BEGIN
  139.                 IF @Tipo = 'L'
  140.                         SET @Val = @Val*-1
  141.                
  142.                 PRINT CONVERT(VARCHAR,@NumM) + ' - ' + CONVERT(VARCHAR,@DATA) + ' - ' + CONVERT(VARCHAR,@Val)
  143.                 SET @Tot = @Tot+1
  144.                 FETCH NEXT FROM C_Mov INTO @NumM, @DATA, @Val, @Tipo
  145.         END
  146.         CLOSE C_Mov
  147.         DEALLOCATE C_Mov
  148.        
  149.         IF @Tot < 10
  150.         BEGIN
  151.                 DECLARE C_HistMov CURSOR
  152.                 FOR (SELECT TOP 10 N_movimento, DATA, Valor, Tipo FROM Histórico_Movimentos WHERE N_conta = @NC OREDER BY DATA DESC)
  153.                 OPEN C_HistMov
  154.                 FETCH FIRST FROM C_Mov INTO @NumM, @DATA, @Val, @Tipo
  155.                 WHILE @@FETCH_STATUS = 0 AND @Tot < 10
  156.                 BEGIN
  157.                         IF @Tipo = 'L'
  158.                                 SET @Val = @Val*-1
  159.                        
  160.                         PRINT CONVERT(VARCHAR,@NumM) + ' - ' + CONVERT(VARCHAR,@DATA) + ' - ' + CONVERT(VARCHAR,@Val)
  161.                         SET @Tot = @Tot+1
  162.                         FETCH NEXT FROM C_HistMov INTO @NumM, @DATA, @Val, @Tipo
  163.                 END
  164.                 CLOSE C_HistMov
  165.                 DEALLOCATE C_HistMov
  166.         END
  167. END
  168.  
  169. /* c) */
  170. CREATE PROCEDURE EstatMovAux
  171.         @B INT,
  172.         @Balc INT,
  173.         @Mes INT,
  174.         @Ano INT OUTPUT,
  175.         @Per1 FLOAT OUTPUT,
  176.         @S1 MONEY OUTPUT,
  177.         @Per11 FLOAT OUTPUT,
  178.         @S11 MONEY OUTPUT,
  179.         @Per22 FLOAT OUTPUT,
  180.         @S22 MONEY OUTPUT
  181. AS
  182. BEGIN
  183.         DECLARE @Tot INT,
  184.                 @Tot2 INT
  185.         /* TOTAL DE CONTAS DO MES */
  186.         SET @Tot = (SELECT COUNT(*) FROM d_Bancos b JOIN d_Balcoes bal
  187.                         ON b.Código = bal.Codigo JOIN d_Contas c
  188.                                 ON c.N_balcao = bal.N_balcao JOIN d_Movimentos m
  189.                                         ON c.N_conta = m.N_conta
  190.                         WHERE b.Código = @B
  191.                             AND bal.N_Balcão = @Balc
  192.                             AND DATEPART(MONTH,m.DATA) = @Mes
  193.                             AND DATEPART(YEAR,m.DATA) = MAX(DATEPART(YEAR,m.DATA)))
  194.                            
  195.         /* PERCENTAGEM, SOMA E ANO DO MES (LEVANTAMENTO) */
  196.         SELECT @Per1 = COUNT(*), @S1 = SUM(m.Valor), @Ano = MAX(DATEPART(YEAR,m.DATA)
  197.                 FROM Banco b JOIN d_Balcoes bal
  198.                         ON b.Código = bal.Codigo JOIN d_Contas c
  199.                                 ON c.N_Balcão = bal.N_Balcao JOIN d_Movimentos m
  200.                                         ON c.N_conta = m.N_conta
  201.                 WHERE b.Código = @B
  202.                         AND bal.N_Balcão = @Balc
  203.                         AND DATEPART(MONTH,m.DATA) = @Mes
  204.                         AND DATEPART(YEAR,m.DATA) = @Ano)
  205.                         AND m.Tipo = 'L')
  206.                            
  207.         /* PERCENTAGEM E SOMA DO MES (DEPOSITO) */
  208.         SELECT @Per2 = COUNT(*), @S2 = SUM(m.Valor)
  209.                 FROM Banco b JOIN d_Balcoes bal
  210.                         ON b.Código = bal.Codigo JOIN d_Contas c
  211.                                 ON c.N_Balcão = bal.N_Balcao JOIN d_Movimentos m
  212.                                         ON c.N_conta = m.N_conta
  213.                 WHERE b.Código = @B
  214.                         AND bal.N_Balcão = @Balc
  215.                         AND DATEPART(MONTH,m.DATA) = @Mes
  216.                         AND DATEPART(YEAR,m.DATA) = @Ano)
  217.                         AND m.Tipo = 'D')
  218.        
  219.        /* TOTAL DE CONTAS DO MES ANTERIOR */
  220.         SET @Tot2 = (SELECT COUNT(*) FROM Banco b JOIN d_Balcoes bal
  221.                         ON b.Código = bal.Codigo JOIN d_Contas c
  222.                                 ON c.N_Balcão = bal.N_Balcao JOIN d_Movimentos m
  223.                                         ON c.N_conta = m.N_conta
  224.                         WHERE b.Código = @B
  225.                             AND bal.N_Balcão = @Balc
  226.                             AND DATEPART(MONTH,m.DATA) = @Mes-1
  227.                             AND DATEPART(YEAR,m.DATA) = MAX(DATEPART(YEAR,m.DATA)))
  228.  
  229.         /* PERCENTAGEM, SOMA E ANO DO MES ANTERIOR */
  230.         SELECT @Per11 = COUNT(*), @S11 = SUM(m.Valor), @Ano = MAX(DATEPART(YEAR,m.DATA)
  231.                 FROM Banco b JOIN d_Balcoes bal
  232.                         ON b.Código = bal.Codigo JOIN d_Contas c
  233.                                 ON c.N_Balcão = bal.N_Balcao JOIN d_Movimentos m
  234.                                         ON c.N_conta = m.N_conta
  235.                 WHERE b.Código = @B
  236.                         AND bal.N_Balcão = @Balc
  237.                         AND DATEPART(MONTH,m.DATA) = @Mes-1
  238.                         AND DATEPART(YEAR,m.DATA) = @Ano)
  239.                         AND m.Tipo = 'L')
  240.  
  241.         /* PERCENTAGEM E SOMA DO MES ANTERIOR (DEPOSITO) */
  242.         SELECT @Per22 = COUNT(*), @S22= SUM(m.Valor)
  243.                 FROM Banco b JOIN d_Balcoes bal
  244.                         ON b.Código = bal.Codigo JOIN d_Contas c
  245.                                 ON c.N_Balcão = bal.N_Balcao JOIN d_Movimentos m
  246.                                         ON c.N_conta = m.N_conta
  247.                 WHERE b.Código = @B
  248.                         AND bal.N_Balcão = @Balc
  249.                         AND DATEPART(MONTH,m.DATA) = @Mes-1
  250.                         AND DATEPART(YEAR,m.DATA) = @Ano)
  251.                         AND m.Tipo = 'D')
  252.  
  253.         /* calcular percentagens de 0 a 100 */
  254.         SET @Per1 = 100*@Per1/@Tot
  255.         SET @Per2 = 100*@Per2/@Tot
  256.         SET @Per11 = 100*@Per11/@Tot
  257.         SET @Per22 = 100*@Per22/@Tot
  258. END
  259.  
  260. GO
  261.  
  262. CREATE PROCEDURE PEstatMov
  263.         @Mes INT
  264. AS
  265. BEGIN
  266.         DECLARE @EstatMov TABLE (Banco VARCHAR(50), Balcão INT, Ano INT, Mês INT, Tipo CHAR(1), PerMov INT, Tot MONEY, PerMovAnt INT, TotAnt MONEY)
  267.  
  268.         DECLARE @Cod INT,
  269.                 @Nome VARCHAR(50),
  270.                 @NBal INT,
  271.                 @Ano INT,
  272.                 @Per1 FLOAT,
  273.                 @S1 MONEY,
  274.                 @Per11 FLOAT,
  275.                 @S11 MONEY,
  276.                 @Per2 FLOAT,
  277.                 @S2 MONEY
  278.                 @Per22 FLOAT,
  279.                 @S22 MONEY    
  280.  
  281.         DECLARE C_Mov CURSOR
  282.         FOR (SELECT b.Código, b.Nome_banco, bal.N_Balcão FROM d_Bancos b JOIN d_Balcoes bal
  283.                 ON b.Código = bal.Codigo
  284.                 ORDER BY Banco b.Nome_banco, bal.N_Balcão)
  285.         OPEN C_Mov
  286.         FETCH FIRST FROM C_Mov INTO @Cod,@Nome,@NBal
  287.         WHILE @@FETCH_STATUS = 0
  288.         BEGIN
  289.                 EXEC EstatMovAux @Cod, @NBal, @Mes,@Ano OUTPUT,@Per1 OUTPUT,@S1 OUTPUT,@Per2 OUTPUT,@S2 OUTPUT,@Per11 OUTPUT,@S11 OUTPUT,@Per22 OUTPUT,@S22 OUTPUT
  290.                 INSERT INTO @EstatMov VALUES(@Nome,@NBal,@Ano,@Mes,'L',@Per1,@S1,@Per11,@S11)
  291.                 INSERT INTO @EstatMov VALUES(@Nome,@NBal,@Ano,@Mes,'D',@Per2,@S2,@Per22,@S22)
  292.                 FETCH NEXT FROM C_Mov INTO @Cod,@Nome,@NBal
  293.         END
  294.         CLOSE C_Mov
  295.         DEALLOCATE C_Mov
  296.  
  297.         SELECT * FROM @EstatMov
  298. END
  299.  
  300. GO
  301.  
  302. EXEC PEstatMov 1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement