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

Puedes crear la base de datos que cree(se llama pagos) o quitar esa parte y solo ejecutar esto:

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

Me imagino que quitaste o comentaste los resultados de las consultas que puse no?? Porque ese no es codigo ejecutable :P
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me