Ver Mensaje Individual
  #13 (permalink)  
Antiguo 10/02/2016, 10:44
Avatar de Libras
Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 9 meses
Puntos: 774
Respuesta: extraer solo los usuarios que no hayan cancelado un mes

Ahi esta la base de datos, con fechas y con montos de pago, asi mismo vienen las consultas para obtener quien pago que mes, quien no ha pagado asi como cuanto le falta por pagar a alguien(en caso de manejar las cuotas)

Código SQL:
Ver original
  1. CREATE DATABASE Pagos
  2. USE pagos
  3.  
  4. CREATE TABLE clientes(
  5. id INT IDENTITY(1,1),
  6. nombre Nvarchar(20)
  7. )
  8.  
  9. INSERT INTO clientes VALUES ('Libras')
  10. INSERT INTO clientes VALUES ('Libras1')
  11. INSERT INTO clientes VALUES ('Libras2')
  12.  
  13. CREATE TABLE cuentas(
  14. id INT IDENTITY(1,1),
  15. id_cliente INT,
  16. monto INT
  17. )
  18.  
  19. INSERT INTO cuentas VALUES (1,50)
  20. INSERT INTO cuentas VALUES (2,100)
  21. INSERT INTO cuentas VALUES (3,50)
  22.  
  23. CREATE TABLE meses(
  24. id INT IDENTITY(1,1),
  25. mes Nvarchar(20)
  26. )
  27.  
  28. INSERT INTO meses VALUES ('Enero')
  29. INSERT INTO meses VALUES ('Febrero')
  30. INSERT INTO meses VALUES ('Marzo')
  31. INSERT INTO meses VALUES ('Abril')
  32. INSERT INTO meses VALUES ('Mayo')
  33. INSERT INTO meses VALUES ('junio')
  34. INSERT INTO meses VALUES ('julio')
  35. INSERT INTO meses VALUES ('Agosto')
  36. INSERT INTO meses VALUES ('Septiembre')
  37. INSERT INTO meses VALUES ('Octubre')
  38. INSERT INTO meses VALUES ('noviembre')
  39. INSERT INTO meses VALUES ('diciembre')
  40.  
  41. CREATE TABLE years(
  42. id INT IDENTITY(1,1),
  43. years INT
  44. )
  45.  
  46. INSERT INTO years VALUES (2016)
  47. INSERT INTO years VALUES (2017)
  48.  
  49. CREATE TABLE years_months(
  50. id INT IDENTITY(1,1),
  51. id_year INT,
  52. id_mont INT
  53. )
  54.  
  55.  
  56. INSERT INTO years_months VALUES (1,1)
  57. INSERT INTO years_months VALUES (1,2)
  58. INSERT INTO years_months VALUES (1,3)
  59. INSERT INTO years_months VALUES (1,4)
  60. INSERT INTO years_months VALUES (1,5)
  61. INSERT INTO years_months VALUES (1,6)
  62. INSERT INTO years_months VALUES (1,7)
  63. INSERT INTO years_months VALUES (1,8)
  64. INSERT INTO years_months VALUES (1,9)
  65. INSERT INTO years_months VALUES (1,10)
  66. INSERT INTO years_months VALUES (1,11)
  67. INSERT INTO years_months VALUES (1,12)
  68.  
  69.  
  70. CREATE TABLE pagos(
  71. id INT IDENTITY(1,1),
  72. id_cliente INT,
  73. id_year_month INT,
  74. cantidad INT
  75. )
  76.  
  77. INSERT INTO pagos VALUES (1,1,50)
  78. INSERT INTO pagos VALUES (2,1,100)
  79. INSERT INTO pagos VALUES (1,2,100)
  80.  
  81. ------------------------------------
  82.  
  83. --los que han pagado en el mes
  84. SELECT t1.id, t1.nombre FROM clientes AS t1
  85. LEFT JOIN pagos AS t2 ON (t1.id=t2.id_cliente)
  86. LEFT JOIN years_months AS t3 ON (t2.id_year_month=t3.id)
  87. LEFT JOIN meses AS t4 ON (t3.id_mont=t4.id)
  88. LEFT JOIN years AS t5 ON (t3.id_year=t5.id)
  89. WHERE t4.mes='febrero' AND t5.years=2016
  90.  
  91. -------------------------------------
  92.  
  93. SELECT t1.* FROM clientes AS t1
  94. LEFT JOIN (
  95. SELECT t1.id, t1.nombre FROM clientes AS t1
  96. LEFT JOIN pagos AS t2 ON (t1.id=t2.id_cliente)
  97. LEFT JOIN years_months AS t3 ON (t2.id_year_month=t3.id)
  98. LEFT JOIN meses AS t4 ON (t3.id_mont=t4.id)
  99. LEFT JOIN years AS t5 ON (t3.id_year=t5.id)
  100. WHERE t4.mes='enero' AND t5.years=2016) AS pagados ON (t1.id=pagados.id AND t1.nombre=pagados.nombre)
  101. WHERE pagados.nombre IS NULL
  102.  
  103. --No han pagado en el mes, aqui aparece Libras2 que no ha pagado nada del mes de febrero
  104. id  nombre
  105. 3   Libras2
  106. ---------------------------------------
  107.  
  108. --relacion de pagos contra lo que tiene que pagar segun su cuenta
  109. SELECT t1.nombre,
  110. t2.cantidad,
  111. t6.monto,
  112. t6.monto-t2.cantidad AS faltante
  113. FROM clientes AS t1
  114. LEFT JOIN pagos AS t2 ON (t1.id=t2.id_cliente)
  115. LEFT JOIN years_months AS t3 ON (t2.id_year_month=t3.id)
  116. LEFT JOIN meses AS t4 ON (t3.id_mont=t4.id)
  117. LEFT JOIN years AS t5 ON (t3.id_year=t5.id)
  118. LEFT JOIN cuentas AS t6 ON (t1.id=t6.id_cliente)
  119. WHERE t4.mes='febrero' AND t5.years=2016
  120.  
  121. UNION
  122.  
  123. SELECT t1.nombre,0, t2.monto, t2.monto AS faltante FROM clientes AS t1
  124. LEFT JOIN (
  125. SELECT t1.id, t1.nombre FROM clientes AS t1
  126. LEFT JOIN pagos AS t2 ON (t1.id=t2.id_cliente)
  127. LEFT JOIN years_months AS t3 ON (t2.id_year_month=t3.id)
  128. LEFT JOIN meses AS t4 ON (t3.id_mont=t4.id)
  129. LEFT JOIN years AS t5 ON (t3.id_year=t5.id)
  130. WHERE t4.mes='febrero' AND t5.years=2016) AS pagados ON (t1.id=pagados.id AND t1.nombre=pagados.nombre)
  131. LEFT JOIN cuentas AS t2 ON (t1.id=t2.id_cliente)
  132. WHERE pagados.nombre IS NULL
  133.  
  134.  
  135. --Aqui sale un numero en negativo(saldo a favor) jejejeje eso es que Libras pago 100 cuando deberia de haber pagado solo 50 ;)
  136. nombre  cantidad    monto   faltante
  137. Libras  100 50  -50
  138. Libras1 0   100 100
  139. Libras2 0   50  50

La base de datos asi como los queries son para SQL SERVER........ y sin necesidad de la famosa tabla donde agrego a todos cada mes y los voy borrando........

dudas comentarios??????
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me