FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
Cita:
__________________
Un saludo desde Canarias, "El abuelo Cebolleta" |
#2
|
||||
|
||||
Para montar un ejemplo con datos (de prueba) y esquema en un motor de BD en linea, ideal para compartir codigo/datos sql y hacer consultas en linea
__________________
El malabarista. |
#3
|
||||
|
||||
Hola de nuevo,
a ver si ahora podemos dar un poco de juego al tema.... Esta es la query de la que partimos... yo cambiaría el rigth join por left join y quitaría la condición de fechas. Qué hace, me saca todos los clientes, y todas las fras. Aquellos clientes que no tengan fras, tendrán los datos de la tabla de facturas en blanco.
Bueno, si quiero saber qué me facturan los clientes entre una fecha, pongo el filtro. Al ponerlo, todos aquellos clientes que no tienen facturas en esas fechas, desaparecen porque las fechas ( que serán nulas ) no cumplen la condición. Para que no se pierdan, sustituyo la condición por Ahora tendrían que salir todos los que quiero. Vamos a agruparlos. Quiero agrupar por cliente, es decir, una fila por cliente y el total. Para ello solo necesito el codigo y nombre del cliente y el montante de las fras, que sumo, el resto de campos sobra. SELECT C.CODIGO, C.NOMBRE, SUM(F.TOTAL) FROM CLIENTES C LEFT JOIN FACTURA F ON (C.CODIGO=F.CODIGOCLIENTE) WHERE (F.FECHA BETWEEN '04/01/2014' AND '04/30/2014' OR F.FECHA is null) group by C.CODIGO, C.NOMBRE ORDER BY C.ID En principio ya tendría los datos tal y como los quiero. Aquellos clientes que no tienen fras, el total lo tendrán a nulos. Con una máscara en el dataset que muestra los datos supongo que será suficiente, si no, habría que utilizar la función colaesce en la consulta. Para terminar, paso a detallar cómo se consigue poner los meses en columnas, tal y como me ha pedido el abuelete, dado que yo me he ofrecido a hacerlo, claro. Para ello, cambio la condición del where para que me saque el año completo y sumo en cada columna si se cumple la condición, es decir, si el mes corresponde a la columna. SELECT C.CODIGO, C.NOMBRE, SUM(F.TOTAL) as TOTAL, SUM( case when extract(month from F.FECHA) = 1 then F.TOTAL else 0 end) as ENERO, SUM( case when extract(month from F.FECHA) = 2 then F.TOTAL else 0 end) as FEBRERO, ... SUM( case when extract(month from F.FECHA) = 12 then F.TOTAL else 0 end) as DICIEMBRE FROM CLIENTES C LEFT JOIN FACTURA F ON (C.CODIGO=F.CODIGOCLIENTE) WHERE (F.FECHA BETWEEN '01/01/2014' AND '12/31/2014' OR F.FECHA is null) group by C.CODIGO,C.NOMBRE ORDER BY C.ID Ya para acabar y poner la guinda sobre la nata, se puede hacer que la consulta coja la fecha del sistema, calcule el mes y saque las facturas de los últimos 13 meses por cliente, aprovechando para calcular la tendencia anual móvil y ver cómo evoluciona nuestro negocio. Ojo, estas últimas consultas deben ser estudiadas cuidadosamente, ya que si por falta de tunning de la bbdd o por tener muchos registros las tablas, pueden demorar bastante y puede ser necesario utilizar otra técnica para extraer estos datos. Espero que el abuelete esté servido para estudiar un par de horitas y convertirse en el rey de las consultas... Independientemente, quedo a tu absoluta disposición para aclarar cualquier duda que puedas tener. Un saludo PD: En una ocasión Casimiro enlazó una infografía en la que se explicaba muy sencillamente y muy claro los inner , left y rigth join. Veré si lo encuentro...
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino - |
#4
|
||||
|
||||
Vuelvo e insisto: Ejemplos de datos. Y no solo de lo que tienes, sino de como se debe *ver*. Esto es importante porque entre otras cosas, como validar que lo que te indiquemos es correcto o no? Las palabras pueden ser ambiguas pero los datos concretos no.
__________________
El malabarista. |
#5
|
||||
|
||||
Cita:
Cita:
Gracias a ti también Javier, te comento no era exactamente lo que buscaba, ya que no recorría todos los cliente, aunque te acercaste mucho con la siguiente, consulta, a la que tuve que quitarle el order by y añadir el campo que estaba en esta al principio del Group by
Lo que si me ha gustado mucho y pienso implementarlo es to solución para ver el año, tuve que corregirla lo mismo, pero quedo francamente bien
Me gustaría, poder especificar el años, así que investigare, pero para ello deberé crear datos falsos, pero lo investigaré Cita:
Poner en verde, los que hubiesen comprado y pagado, en crema a los que hubiesen comprado, pero aún no hubiesen pagado y por último en rojo los que simplemente no habían comprado en esas fechas Como digo tenían razón ya que un cliente podía tener facturas, unas pagas y potras no, pero yo quería la que me diera el total del comprado entre esas fechas y no me hacia falta tantos datos, así que me bastaba con el código del cliente, el nombre del mismo y el total de compras en ese mes (el importe) Los datos del cliente, vamos a inventarlos serian: (ID, código, Nombre) 1, 1, Bar Pepito 5, 2, Taller Mor 6, 3, Viajes Toma 9, 5, Junito 16, 8, Residencia Salud Los datos de las Facturas (ejemplos también) serian: (Código cliente, Total de la factura) 1, 20 8, 16.52 3, 42.21 1, 45.30 8, 125.16 El resultado debería ser ordenado por el ID (Código, Nombre, total) 1, Bar Pepito, 65.30 2, Taller Mor, 0 3, Viajes Toma, 42.21 5, Junito, 0 8, Residencia Salud, 141.68 Espero que te refirieras a esto y lamento pero no se como colocar tablas aquí De todas maneras, Gracias a Marc y a Sergio de El club hermano DelphiAccess, lo he solucionado con la siguiente consulta
Gracias a todos, he aprendido muchas cosas, espero no olvidarlas, o no perderlas, ya que siempre suelo guardarlas
__________________
Un saludo desde Canarias, "El abuelo Cebolleta" |
#6
|
||||
|
||||
Pro cierto Javier según he terminado de montar la respuesta anterior, he buscado Firebird y Year i me ha llevado a http://www.firebirdsql.org/refdocs/l...c-extract.html que supongo es lo que necesito, imagino que donde ponemos las lineas
Por
Donde XXXX sea el año que estamos buscando, supongo que será algo así, en cuanto pueda lo probare Supongo que si no especifico el año, me estaría leyendo, todas las facturas de diversos años, colocando las cada una en el mes que corresponda, que esta bien si quieres saber el total de ventas, por meses de cllintes y el total comprado, así que es muy probable que implemente las dos, una con el total comprado, con todos los datos que tengamos, sabiendo en que meses compra más determinados clientes y otra para saber por año, gracias nuevamente. Por cierto lo probé y funciona
__________________
Un saludo desde Canarias, "El abuelo Cebolleta" Última edición por José Luis Garcí fecha: 27-04-2014 a las 09:49:26. |
#7
|
||||
|
||||
Hola,
completando un poco lo comentado, para saber los datos de los ultimos 13 meses ( o los que quieras ) con una llamada única independientemente de la fecha de la ejecución, utilizaríamos lo siguente:
da el primer día del mes actual, al que le voy restando meses con la función DATEADD(). Tengase en cuenta que se deberán poner tantas columnas como se desee, teniendo en cuenta que luego en le filtro habrá que hacer coincidir el nº de días con la profundidad hacia atrás que queramos conseguir ( en este caso 365 días , tendría que haber puesto 12 columnas correspondientes a 12 meses). Abuelete, ten en cuenta que con esta consulta no tendrás que construir la consulta dinámicamente ni tener en cuenta el año, simplemente tendrás que ajustar los nombres de las columnas. Otra cosa, por simplificar he puesto la condición between, deberá ser fecha >= fecha_primer_dia_del mes and fecha < fecha_primer_dia_del_mes_siguiente A prtir de aquí se puede hacer cualquier cosa que se imagine pivotando sobre esta idea y ajustando las condiciones a lo que queramos. Espero que te valga. Un saludo
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino - |
#8
|
||||
|
||||
Hola José.
Primero que nada buenísimo que solucionaras el tema . Cita:
Saludos
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Servicios gratuitos para montar una empresa (WEB) | MAXIUM | La Taberna | 9 | 05-11-2013 08:18:02 |
Solicito ayuda en cuestiones de montar un TPV | José Luis Garcí | Varios | 10 | 14-03-2012 09:05:49 |
Seleccion multiple para montar query | tgsistemas | SQL | 8 | 22-04-2010 18:48:19 |
Montar un apache para dominio publico, que necesito... | alexander66 | PHP | 2 | 28-03-2007 00:52:33 |
Montar red para 2 PCs | alfredosg19 | Redes | 5 | 17-07-2006 09:07:23 |
|