Kimossab

SIBD - Prova Tipo 2013

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