Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General »

extraer solo los usuarios que no hayan cancelado un mes

Estas en el tema de extraer solo los usuarios que no hayan cancelado un mes en el foro de Bases de Datos General en Foros del Web. Buen día, tarde o Noche dependiendo jajaja Me dirijo a ustedes con la finalidad de despejar mi duda con una base de datos que posee ...
  #1 (permalink)  
Antiguo 05/02/2016, 14:08
 
Fecha de Ingreso: agosto-2011
Mensajes: 87
Antigüedad: 12 años, 9 meses
Puntos: 3
extraer solo los usuarios que no hayan cancelado un mes

Buen día, tarde o Noche dependiendo jajaja

Me dirijo a ustedes con la finalidad de despejar mi duda con una base de datos que posee las tablas

CLIENTES

id_cliente nombre apellido


MESES

id_mes nombre_mes


AÑO

id_año año


PAGOS

id_pago id_cliente id_mes id_año

Cuando una persona paga un mes, se guardan los datos respectivos en la tabla PAGOS, ok todo fino... las consultas de las personas que pagan por mes y año e incluso verifico si la persona ah pagado el mes y año dado con anterioridad...

Ahora el problemita que tengo es que quiero mostrar toodas las personas que NO HAN PAGADO un MES (con su respectivo año). y no logro hacer esa consulta!

por ejemplo... Quisiera mostrar los nombres y apellidos de las personas que no han pagado el mes de FEBRERO del año 2016

alguna idea de como hacerlo?


De antemano gracias a todos!
  #2 (permalink)  
Antiguo 05/02/2016, 15:02
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: extraer solo los usuarios que no hayan cancelado un mes

seria algo como esto:

Código SQL:
Ver original
  1. SELECT * FROM pagos AS t1
  2. LEFT JOIN clientes AS t2 ON (t1.id_cliente0t2.id_cliente)
  3. WHERE t1.año='2016' AND t1.mes='febrero' AND t2.cliente IS NULL
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 05/02/2016, 17:58
 
Fecha de Ingreso: agosto-2011
Mensajes: 87
Antigüedad: 12 años, 9 meses
Puntos: 3
Respuesta: extraer solo los usuarios que no hayan cancelado un mes

Cita:
Iniciado por Libras Ver Mensaje
seria algo como esto:

Código SQL:
Ver original
  1. SELECT * FROM pagos AS t1
  2. LEFT JOIN clientes AS t2 ON (t1.id_cliente0t2.id_cliente)
  3. WHERE t1.año='2016' AND t1.mes='febrero' AND t2.cliente IS NULL
ok.. primero gracias por responder...

tu respuesta es exelente, pero me hace creer que mi base de datos está mal organizada,

pues el codigo me sirve de esta manera

Código SQL:
Ver original
  1. SELECT C.p_nombre, C.p_apellido, F.id_cliente, F.id_mes
  2. FROM clientes AS C
  3. LEFT JOIN facturacion AS F ON F.id_cliente=C.id
  4. WHERE F.id_mes IS NULL

pero el detalle está en que nunca me va a arrojar los resultados dependiendo del mes,

tienes alguna idea de como armar la base de datos para que me pueda arrojar los resultados de los que no han pagado algun mes especifico?

porque en estos momentos la tengo estructurada asi y no creo que me sirva para hacer esa consulta


Última edición por gnzsoloyo; 10/02/2016 a las 11:02
  #4 (permalink)  
Antiguo 05/02/2016, 22:29
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: extraer solo los usuarios que no hayan cancelado un mes

como tienes los datos en las tablas meses y años, estos ya estan llenados??? que datos tienes en la tabla anuario??
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 06/02/2016, 12:07
 
Fecha de Ingreso: agosto-2011
Mensajes: 87
Antigüedad: 12 años, 9 meses
Puntos: 3
Respuesta: extraer solo los usuarios que no hayan cancelado un mes

emm.. pues es que estoy intentando probar todo lo que se me ocurre porque necesito hacer esa consulta

En la tabla meses... tengo los mismos... ENERO, FEBRERO, MARZO, ABRIL... en la tabla ANUARIo tengo 2015,2016,2017,2018... dependiendo el año se irá registrando una fila con PHP(automaticamente)

y sí,sí estan llenas todas las tablas
  #6 (permalink)  
Antiguo 06/02/2016, 13:18
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: extraer solo los usuarios que no hayan cancelado un mes

Pero conforme pasa el tiempo vas registrando los meses??? o ya tienes todos los meses para cada año??
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 06/02/2016, 14:50
 
Fecha de Ingreso: agosto-2011
Mensajes: 87
Antigüedad: 12 años, 9 meses
Puntos: 3
Respuesta: extraer solo los usuarios que no hayan cancelado un mes

Los 12 meses ya están registrados, los años son los que se registran automáticamente si no han sido registrado antes.

He pensado hasta en crear una tabla llamada DEUDAS donde cada mes, todos los clientes se añadan, y conforme vayan pagando, borrarlos de esta tabla y añadirlos a la tabla FACTURACION. ¿estaria mal esta practica? ¿Habría otra forma un poco mas ortodoxa?
  #8 (permalink)  
Antiguo 06/02/2016, 15:20
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: extraer solo los usuarios que no hayan cancelado un mes

Prueba con esto:

Código SQL:
Ver original
  1. SELECT * FROM pagos AS t1
  2. LEFT JOIN clientes AS t2 ON (t1.id_cliente0t2.id_cliente)
  3. LEFT JOIN meses AS t3 ON (t1.id_mes=t3.id_mes)
  4. LEFT JOIN anuario AS t4 ON (t1.id_lapso=t4.id_lapso)
  5. WHERE t4.lapso='2016' AND t3.mes='febrero' AND t2.cliente IS NULL

Y lo que estas pensando no esta nada bien.......
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #9 (permalink)  
Antiguo 07/02/2016, 16:29
 
Fecha de Ingreso: agosto-2011
Mensajes: 87
Antigüedad: 12 años, 9 meses
Puntos: 3
Respuesta: extraer solo los usuarios que no hayan cancelado un mes

verga compa.. que va wn... he pasado todo el tiempo posible en encontrar la solucion y no la hallo, hice lo que te dije:

Crear una nueva tabla en la que cada año se pasen todos los clientes y que a medida que vayan pagando, ir borrandolos de esa lista e ingresandolos a la tabla Facturacion (Los que sí pagan) jajaja...
tendre que diseñar unas cuantas validaciones en PHP :/

Gracias por todo de igual forma (y) me diste unas cuantas ideas.. dejare el post abierto por si tu o alguien mas encuentra la solucion, ademas si la encuentro (espero) la compartire :3
  #10 (permalink)  
Antiguo 10/02/2016, 09:36
 
Fecha de Ingreso: enero-2016
Mensajes: 46
Antigüedad: 8 años, 4 meses
Puntos: 0
Respuesta: extraer solo los usuarios que no hayan cancelado un mes

bueno yo me quede alli en ese mismo detalle.
  #11 (permalink)  
Antiguo 10/02/2016, 09:38
 
Fecha de Ingreso: enero-2016
Mensajes: 46
Antigüedad: 8 años, 4 meses
Puntos: 0
Respuesta: extraer solo los usuarios que no hayan cancelado un mes

Cita:
Iniciado por Camatagua123 Ver Mensaje
Los 12 meses ya están registrados, los años son los que se registran automáticamente si no han sido registrado antes.

He pensado hasta en crear una tabla llamada DEUDAS donde cada mes, todos los clientes se añadan, y conforme vayan pagando, borrarlos de esta tabla y añadirlos a la tabla FACTURACION. ¿estaria mal esta practica? ¿Habría otra forma un poco mas ortodoxa?
Pense lo mismo ^^
  #12 (permalink)  
Antiguo 10/02/2016, 09:47
 
Fecha de Ingreso: enero-2016
Mensajes: 46
Antigüedad: 8 años, 4 meses
Puntos: 0
Respuesta: extraer solo los usuarios que no hayan cancelado un mes



mi base...
  #13 (permalink)  
Antiguo 10/02/2016, 10:44
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 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
  #14 (permalink)  
Antiguo 10/02/2016, 10:55
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: extraer solo los usuarios que no hayan cancelado un mes



El diagrama de la base de datos con todo y sus relaciones :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Última edición por Libras; 10/02/2016 a las 11:01
  #15 (permalink)  
Antiguo 10/02/2016, 11:24
 
Fecha de Ingreso: enero-2016
Mensajes: 46
Antigüedad: 8 años, 4 meses
Puntos: 0
Respuesta: extraer solo los usuarios que no hayan cancelado un mes

Cita:
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??????
donde puedo pegar ese codigo en sql server 2012 me da error por todos lados. ^^
  #16 (permalink)  
Antiguo 10/02/2016, 11:36
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 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
  #17 (permalink)  
Antiguo 10/02/2016, 11:41
 
Fecha de Ingreso: enero-2016
Mensajes: 46
Antigüedad: 8 años, 4 meses
Puntos: 0
Respuesta: extraer solo los usuarios que no hayan cancelado un mes

si hay agarro el tiro, ahora como puedo ver los pagos de libras y lo que debe? pero en meses.?
  #18 (permalink)  
Antiguo 10/02/2016, 11:43
 
Fecha de Ingreso: enero-2016
Mensajes: 46
Antigüedad: 8 años, 4 meses
Puntos: 0
Respuesta: extraer solo los usuarios que no hayan cancelado un mes

ejemplo libras pago enero , febero, aun debe los meses restantes como lo muestro?
  #19 (permalink)  
Antiguo 10/02/2016, 12:34
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: extraer solo los usuarios que no hayan cancelado un mes

un pequeño cambio:

Código SQL:
Ver original
  1. IF OBJECT_ID('dbo.years_months', 'U') IS NOT NULL
  2.   DROP TABLE dbo.years_months;
  3.  
  4. IF OBJECT_ID('dbo.pagos', 'U') IS NOT NULL
  5.   DROP TABLE dbo.pagos;
  6.  
  7. IF OBJECT_ID('dbo.cuentas', 'U') IS NOT NULL
  8.   DROP TABLE dbo.cuentas;
  9.  
  10.  
  11. IF OBJECT_ID('dbo.clientes', 'U') IS NOT NULL
  12.   DROP TABLE dbo.clientes;
  13.    
  14.  
  15. IF OBJECT_ID('dbo.meses', 'U') IS NOT NULL
  16.   DROP TABLE dbo.meses;
  17.  
  18. IF OBJECT_ID('dbo.years', 'U') IS NOT NULL
  19.   DROP TABLE dbo.years;
  20.  
  21.  
  22.  
  23.  
  24. CREATE TABLE clientes(
  25. id INT IDENTITY(1,1),
  26. nombre Nvarchar(20)
  27. )
  28.  
  29. INSERT INTO clientes VALUES ('Libras')
  30. INSERT INTO clientes VALUES ('Libras1')
  31. INSERT INTO clientes VALUES ('Libras2')
  32.  
  33.  
  34. CREATE TABLE cuentas(
  35. id INT IDENTITY(1,1),
  36. id_cliente INT,
  37. years_months INT,
  38. monto INT
  39. )
  40.  
  41. INSERT INTO cuentas VALUES (1,1,50)
  42. INSERT INTO cuentas VALUES (1,2,100)
  43. INSERT INTO cuentas VALUES (1,3,50)
  44. INSERT INTO cuentas VALUES (1,4,50)
  45. INSERT INTO cuentas VALUES (1,5,100)
  46. INSERT INTO cuentas VALUES (1,6,50)
  47. INSERT INTO cuentas VALUES (1,7,50)
  48. INSERT INTO cuentas VALUES (1,8,100)
  49. INSERT INTO cuentas VALUES (1,9,50)
  50. INSERT INTO cuentas VALUES (1,10,50)
  51. INSERT INTO cuentas VALUES (1,11,100)
  52. INSERT INTO cuentas VALUES (1,12,50)
  53.  
  54.  
  55. INSERT INTO cuentas VALUES (2,1,50)
  56. INSERT INTO cuentas VALUES (2,2,100)
  57. INSERT INTO cuentas VALUES (2,3,50)
  58. INSERT INTO cuentas VALUES (2,4,50)
  59. INSERT INTO cuentas VALUES (2,5,100)
  60. INSERT INTO cuentas VALUES (2,6,50)
  61. INSERT INTO cuentas VALUES (2,7,50)
  62. INSERT INTO cuentas VALUES (2,8,100)
  63. INSERT INTO cuentas VALUES (2,9,50)
  64. INSERT INTO cuentas VALUES (2,10,50)
  65. INSERT INTO cuentas VALUES (2,11,100)
  66. INSERT INTO cuentas VALUES (2,12,50)
  67.  
  68.  
  69. INSERT INTO cuentas VALUES (3,1,50)
  70. INSERT INTO cuentas VALUES (3,2,100)
  71. INSERT INTO cuentas VALUES (3,3,50)
  72. INSERT INTO cuentas VALUES (3,4,50)
  73. INSERT INTO cuentas VALUES (3,5,100)
  74. INSERT INTO cuentas VALUES (3,6,50)
  75. INSERT INTO cuentas VALUES (3,7,50)
  76. INSERT INTO cuentas VALUES (3,8,100)
  77. INSERT INTO cuentas VALUES (3,9,50)
  78. INSERT INTO cuentas VALUES (3,10,50)
  79. INSERT INTO cuentas VALUES (3,11,100)
  80. INSERT INTO cuentas VALUES (3,12,50)
  81.  
  82.  
  83. CREATE TABLE meses(
  84. id INT IDENTITY(1,1),
  85. mes Nvarchar(20)
  86. )
  87.  
  88. INSERT INTO meses VALUES ('Enero')
  89. INSERT INTO meses VALUES ('Febrero')
  90. INSERT INTO meses VALUES ('Marzo')
  91. INSERT INTO meses VALUES ('Abril')
  92. INSERT INTO meses VALUES ('Mayo')
  93. INSERT INTO meses VALUES ('junio')
  94. INSERT INTO meses VALUES ('julio')
  95. INSERT INTO meses VALUES ('Agosto')
  96. INSERT INTO meses VALUES ('Septiembre')
  97. INSERT INTO meses VALUES ('Octubre')
  98. INSERT INTO meses VALUES ('noviembre')
  99. INSERT INTO meses VALUES ('diciembre')
  100.  
  101. CREATE TABLE years(
  102. id INT IDENTITY(1,1),
  103. years INT
  104. )
  105.  
  106. INSERT INTO years VALUES (2016)
  107. INSERT INTO years VALUES (2017)
  108.  
  109. CREATE TABLE years_months(
  110. id INT IDENTITY(1,1),
  111. id_year INT,
  112. id_mont INT
  113. )
  114.  
  115.  
  116. INSERT INTO years_months VALUES (1,1)
  117. INSERT INTO years_months VALUES (1,2)
  118. INSERT INTO years_months VALUES (1,3)
  119. INSERT INTO years_months VALUES (1,4)
  120. INSERT INTO years_months VALUES (1,5)
  121. INSERT INTO years_months VALUES (1,6)
  122. INSERT INTO years_months VALUES (1,7)
  123. INSERT INTO years_months VALUES (1,8)
  124. INSERT INTO years_months VALUES (1,9)
  125. INSERT INTO years_months VALUES (1,10)
  126. INSERT INTO years_months VALUES (1,11)
  127. INSERT INTO years_months VALUES (1,12)
  128.  
  129.  
  130. CREATE TABLE pagos(
  131. id INT IDENTITY(1,1),
  132. id_cliente INT,
  133. id_year_month INT,
  134. cantidad INT
  135. )
  136.  
  137.  
  138.  
  139.  
  140. INSERT INTO pagos VALUES (1,1,50)
  141. INSERT INTO pagos VALUES (2,1,100)
  142. INSERT INTO pagos VALUES (1,2,100)
  143.  
  144. ------------------------------------
  145.  
  146. SELECT * FROM(
  147. SELECT nombre,mes, total_mes, pagado_mes, total_mes - pagado_mes AS faltante FROM(
  148. SELECT t3.nombre,t5.mes, t1.monto total_mes ,isnull(t2.cantidad,0) pagado_mes  FROM cuentas AS t1
  149. LEFT JOIN pagos AS t2 ON (t1.years_months=t2.id_year_month AND t2.id_cliente=t1.id_cliente)
  150. LEFT JOIN clientes AS t3 ON (t1.id_cliente=t3.id)
  151. LEFT JOIN years_months AS t4 ON (t1.years_months=t4.id)
  152. LEFT JOIN meses AS t5 ON (t4.id_mont=t5.id)
  153. ) AS parcial
  154. ) AS completa WHERE faltante>=total_mes
  155.  
  156. ----------------------
  157.  
  158. SELECT * FROM(
  159. SELECT nombre,mes, total_mes, pagado_mes, total_mes - pagado_mes AS faltante, years FROM(
  160. SELECT t3.nombre,t5.mes, t1.monto total_mes ,isnull(t2.cantidad,0) pagado_mes, t6.years  FROM cuentas AS t1
  161. LEFT JOIN pagos AS t2 ON (t1.years_months=t2.id_year_month AND t2.id_cliente=t1.id_cliente)
  162. LEFT JOIN clientes AS t3 ON (t1.id_cliente=t3.id)
  163. LEFT JOIN years_months AS t4 ON (t1.years_months=t4.id)
  164. LEFT JOIN meses AS t5 ON (t4.id_mont=t5.id)
  165. LEFT JOIN years AS t6 ON (t4.id_year=t6.id)
  166. ) AS parcial
  167. ) AS completa WHERE faltante<=0 AND mes='Enero' AND years=2016
  168.  
  169. ------------------------------
  170.  
  171. SELECT * FROM(
  172. SELECT nombre,mes, total_mes, pagado_mes, total_mes - pagado_mes AS faltante, years FROM(
  173. SELECT t3.nombre,t5.mes, t1.monto total_mes ,isnull(t2.cantidad,0) pagado_mes, t6.years  FROM cuentas AS t1
  174. LEFT JOIN pagos AS t2 ON (t1.years_months=t2.id_year_month AND t2.id_cliente=t1.id_cliente)
  175. LEFT JOIN clientes AS t3 ON (t1.id_cliente=t3.id)
  176. LEFT JOIN years_months AS t4 ON (t1.years_months=t4.id)
  177. LEFT JOIN meses AS t5 ON (t4.id_mont=t5.id)
  178. LEFT JOIN years AS t6 ON (t4.id_year=t6.id)
  179. ) AS parcial
  180. ) AS completa WHERE faltante>=total_mes AND mes='Enero' AND years=2016
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #20 (permalink)  
Antiguo 10/02/2016, 13:14
 
Fecha de Ingreso: enero-2016
Mensajes: 46
Antigüedad: 8 años, 4 meses
Puntos: 0
Respuesta: extraer solo los usuarios que no hayan cancelado un mes




una pregunta le cargastes todos los meses a cada 1? como le cargas los meses a cada cliente o como lo relacionas alli?
  #21 (permalink)  
Antiguo 10/02/2016, 13:31
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: extraer solo los usuarios que no hayan cancelado un mes

Asi es los cargue de forma manual, pero se pueden cargar de forma automatica :) mira aqui un ejemplo:

Código SQL:
Ver original
  1. --insertamos 2 nuevos registros
  2. INSERT INTO clientes VALUES ('Libras3')
  3. INSERT INTO clientes VALUES ('Libras4')
  4.  
  5.  
  6. --insertamos los meses del año para 2016
  7. INSERT INTO cuentas
  8. SELECT completa.* FROM(
  9. SELECT id_cliente, id_year_month,50 AS monto  FROM(
  10. SELECT t1.id AS id_cliente, t1.nombre,t2.id AS id_year_month, id_year, id_mont  FROM clientes AS t1,
  11. years_months AS t2) AS t2
  12. LEFT JOIN years AS t3 ON (t2.id_year=t3.id)
  13. WHERE t3.years=2016 --and t2.nombre='Libras3'
  14. ) AS completa
  15. LEFT JOIN cuentas AS t4 ON (completa.id_cliente=t4.id_cliente AND completa.id_year_month=t4.years_months)
  16. WHERE t4.id IS NULL
  17.  
  18. --aparecen todos los usuarios con los meses para el año :), aqui una cosa, el monto queda fijo a 50 por mes :P
  19. SELECT * FROM cuentas
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #22 (permalink)  
Antiguo 10/02/2016, 13:57
 
Fecha de Ingreso: enero-2016
Mensajes: 46
Antigüedad: 8 años, 4 meses
Puntos: 0
Respuesta: extraer solo los usuarios que no hayan cancelado un mes

^^ vermo como que nacistes usando sql, como hicistes la forma manuel de asignarle a un cliente todos los mes? si lo puedes esplicar en español te lo agradesco por que alli esta en ingles jajajaja
  #23 (permalink)  
Antiguo 10/02/2016, 14:05
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: extraer solo los usuarios que no hayan cancelado un mes

La forma manual:

Código SQL:
Ver original
  1. INSERT INTO cuentas VALUES (1,1,50)
  2. INSERT INTO cuentas VALUES (1,2,100)
  3. INSERT INTO cuentas VALUES (1,3,50)
  4. INSERT INTO cuentas VALUES (1,4,50)
  5. INSERT INTO cuentas VALUES (1,5,100)
  6. INSERT INTO cuentas VALUES (1,6,50)
  7. INSERT INTO cuentas VALUES (1,7,50)
  8. INSERT INTO cuentas VALUES (1,8,100)
  9. INSERT INTO cuentas VALUES (1,9,50)
  10. INSERT INTO cuentas VALUES (1,10,50)
  11. INSERT INTO cuentas VALUES (1,11,100)
  12. INSERT INTO cuentas VALUES (1,12,50)

Y la forma automatica:

Código SQL:
Ver original
  1. --insertamos los meses del año para 2016
  2. INSERT INTO cuentas
  3. SELECT completa.* FROM(
  4. SELECT id_cliente, id_year_month,50 AS monto  FROM(
  5. SELECT t1.id AS id_cliente, t1.nombre,t2.id AS id_year_month, id_year, id_mont  FROM clientes AS t1,
  6. years_months AS t2) AS t2
  7. LEFT JOIN years AS t3 ON (t2.id_year=t3.id)
  8. WHERE t3.years=2016 --and t2.nombre='Libras3'
  9. ) AS completa
  10. LEFT JOIN cuentas AS t4 ON (completa.id_cliente=t4.id_cliente AND completa.id_year_month=t4.years_months)
  11. WHERE t4.id IS NULL

Que hace la consulta, bueno....primero obtenemos un producto cartesiano de los clientes con la tabla year_months(producto cartesiano: por cada renglon de years_months tendremos uno para clientes), con esos datos ahora obtenemos el año(para tener 12 meses para cada año) ya teniendo esta informacion podemos unirla a la tbala de cuentas, para saber que cliente ya esta dado de alta para cierto año, los que no esten dados de alta se insertaran :)

P.D: No naci sabiendo SQL server ha sido de poco a poco ir aprendiendo cosas nuevas....y sigo aprendiendo ;)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #24 (permalink)  
Antiguo 10/02/2016, 14:52
 
Fecha de Ingreso: enero-2016
Mensajes: 46
Antigüedad: 8 años, 4 meses
Puntos: 0
Respuesta: extraer solo los usuarios que no hayan cancelado un mes

Código SQL:
Ver original
  1. INSERT INTO cuentas VALUES (1,1,50)
  2.     INSERT INTO cuentas VALUES (1,2,100)
  3.     INSERT INTO cuentas VALUES (1,3,50)
  4.     INSERT INTO cuentas VALUES (1,4,50)
  5.     INSERT INTO cuentas VALUES (1,5,100)
  6.     INSERT INTO cuentas VALUES (1,6,50)
  7.     INSERT INTO cuentas VALUES (1,7,50)
  8.     INSERT INTO cuentas VALUES (1,8,100)
  9.     INSERT INTO cuentas VALUES (1,9,50)
  10.     INSERT INTO cuentas VALUES (1,10,50)
  11.     INSERT INTO cuentas VALUES (1,11,100)
  12.     INSERT INTO cuentas VALUES (1,12,50)


que indica el numero 1 que se repite en las 12 lineas? a su vez el numero secuencial que parte del 2
  #25 (permalink)  
Antiguo 10/02/2016, 15:14
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: extraer solo los usuarios que no hayan cancelado un mes

Código SQL:
Ver original
  1. CREATE TABLE cuentas(
  2. id INT IDENTITY(1,1),
  3. id_cliente INT,
  4. years_months INT,
  5. monto INT
  6. )

La definicion de la tabla cuentas es que tiene un id autonumerico(se genera solo) y que ocupa el id cliente, el id de la tabla years_months(la tabla que tiene los meses y los años) y un monto

Código SQL:
Ver original
  1. INSERT INTO cuentas VALUES (1,1,50)
  2.     INSERT INTO cuentas VALUES (1,2,100)
  3.     INSERT INTO cuentas VALUES (1,3,50)
  4.     INSERT INTO cuentas VALUES (1,4,50)
  5.     INSERT INTO cuentas VALUES (1,5,100)
  6.     INSERT INTO cuentas VALUES (1,6,50)
  7.     INSERT INTO cuentas VALUES (1,7,50)
  8.     INSERT INTO cuentas VALUES (1,8,100)
  9.     INSERT INTO cuentas VALUES (1,9,50)
  10.     INSERT INTO cuentas VALUES (1,10,50)
  11.     INSERT INTO cuentas VALUES (1,11,100)
  12.     INSERT INTO cuentas VALUES (1,12,50)

En el insert el parametro del autonumerico se omite, por lo que el 1 seria el id del cliente, el consecutivo es el id del mes junto con el año(tabla years_months) y la ultima cantidad es el monto a pagar por mes :)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Última edición por Libras; 10/02/2016 a las 15:28
  #26 (permalink)  
Antiguo 10/02/2016, 15:30
 
Fecha de Ingreso: enero-2016
Mensajes: 46
Antigüedad: 8 años, 4 meses
Puntos: 0
Respuesta: extraer solo los usuarios que no hayan cancelado un mes

listo compa muchas gracias por tener pasiencia. Ya logre hacer mi programa le debo esa y otras mas jjajaja =)
  #27 (permalink)  
Antiguo 04/04/2016, 16:54
 
Fecha de Ingreso: agosto-2013
Mensajes: 5
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: extraer solo los usuarios que no hayan cancelado un mes

hola gente tengo un problema parecido...

tratare de explicarme lo mejor que pueda.. .

la cosa es asi...

tengo una tabla con propiedades (casas)

p_id (int)
p_iniciaContrato (date)
p_venceContrato (date)
p_valorMensual (decimel)
y mas que no vienen al caso


tengo otra tabla con los recibos mensuales de los cobros de alquiler.

r_id (int)
r_idPropiedad (int)
r_periodo (date)
r_importe (decimal)
y mas campos que no vienen al caso

cuando el locatario viene a pagar por ejemplo el mes corriente... se genera un recibo ejemplo

r_id=1
r_idPropiedad=20
r_periodo=2016-03-01
r_importe=100.00

y supongamos que viene dentro de 2 meses y paga de nuevo y se genera otro s

r_id=1
r_idPropiedad=20
r_periodo=2016-05-01
r_importe=100.00

como veran se salto un mes.. y asi pueden ser varios.. meses y varias propiedades con casos similares..

lo que el cliente me pide es... seleccionar un periodo, por ejemplo..

desde 2015-01-01 a 2016-01-01

que yo pueda listarle esas propiedades con meses que no se pagaron.. y que tampoco se emitieron recibos.. agrupado por propiedad...

el tema es que no logro bajar los recibos inexistentes... alguno tiene alguna idea? estria muy agradecido..

esto es en php... yo lo hice.. barriendo.. los recibos... con el lapso solicitado.. con un bucle.. consultaba en la base de datos.. mes por mes.. y si el resultado era cero.. lo metia en un array.. esto funciono bien.. pero a medida que se acumularon los recibos.. y ls propiedades... cada vez tardaba mas hasta el timeout.

gracias....
  #28 (permalink)  
Antiguo 04/04/2016, 16:54
 
Fecha de Ingreso: agosto-2013
Mensajes: 5
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: extraer solo los usuarios que no hayan cancelado un mes

ahh perdon.. desde ya que trate de seguir los pasos del compañero.. pero en algun lado me perdi el hilo.. y no puedo dar con el resultado..

Etiquetas: tabla, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:19.