Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 16-09-2011
Avatar de orioncomputer
orioncomputer orioncomputer is offline
Miembro
 
Registrado: may 2006
Ubicación: Maturin, Monagas, Venezuela
Posts: 18
Poder: 0
orioncomputer Va por buen camino
Smile Agrupar de forma condicionada??????

Saludos, Amigos del Club
En Una oportunidad publique una inquietud muy parecida a esta, no logre conseguir una solución y la abandone, pero me ha vuelto la necesidad de recurrir a este foro y plantear de nuevo la inquietud , quizás un poco mas detallada, para ver si entre todos logramos obtener el resultado deseado, ya que en la oportunidad anterior se rompió el hilo, por problemas con el foro y no logre recuperar las respuestas que me habían logrado dar.

Bueno planteo mi inquietud.....

Código:
TipoFac NumeroP    Nombre                                                       TipoCli        NumeroF                 NumeroReal Monto
------- ---------- ------------------------------------------------------------ -------------- ----------------------- ---------- ---------------------------------------
A       Z4A8086521 COPESIRA, C.A                                                Contibuyente   00040263                00040263   173.400
A       Z4A8086521 UNIDAD EDUCATIVA FERMIN TORO                                 Contibuyente   00040264                00040264   338.000
A       Z4A8086521 Ventas Diarias                                               NoContibuyente 00040265 - 00040265     00040265   267.340
A       Z4A8086521 ASOC. COOP. AMBARCA R.L                                      Contibuyente   00040266                00040266   601.450
A       Z4A8086521 CONSEJO COMUNAL CRUZ PERAZA I                                Contibuyente   00040267                00040267   69.360
A       Z4A8086521 Ventas Diarias                                               NoContibuyente 00040268 - 00040268     00040268   213.740
A       Z4A8086521 Ventas Diarias                                               NoContibuyente 00040269 - 00040269     00040269   1597.400
A       Z4A8086521 Ventas Diarias                                               NoContibuyente 00040270 - 00040270     00040270   4.880
A       Z4A8086521 Ventas Diarias                                               NoContibuyente 00040271 - 00040271     00040271   97.530
A       Z4A8086521 Ventas Diarias                                               NoContibuyente 00040272 - 00040272     00040272   24.930
Como verán en la tabla de resultados anterior, hay una serie de datos que limite a 10 filas y 7 Columnas, La idea en concreto de esta consulta es que me entregue agrupados los valores que sean comunes en cuanto a los datos de la columna y me sume los montos, con los valores me refiero a (TipoFac, NumeroP, Nombre, TipoCli, NumeroF y Monto) la columna NumeroReal solo la coloque para referencia, ya que los datos de esta columna van en NumeroF, pero agrupados en desde hasta, bueno les coloco mas abajo como quiero que queden los resultados:

Código:
TipoFac NumeroP    Nombre                                                       TipoCli        NumeroF                 Monto
------- ---------- ------------------------------------------------------------ -------------- ----------------------- ---------------------------------------
A       Z4A8086521 COPESIRA, C.A                                                Contibuyente   00040263                173.400
A       Z4A8086521 UNIDAD EDUCATIVA FERMIN TORO                                 Contibuyente   00040264                338.000
A       Z4A8086521 Ventas Diarias                                               NoContibuyente 00040265 - 00040265     267.340
A       Z4A8086521 ASOC. COOP. AMBARCA R.L                                      Contibuyente   00040266                601.450
A       Z4A8086521 CONSEJO COMUNAL CRUZ PERAZA I                                Contibuyente   00040267                69.360
A       Z4A8086521 Ventas Diarias                                               NoContibuyente 00040268 - 00040272     1938.480
Como ven en el cuadro anterior de la linea 6 a la 10 se agruparon y se sumaron los montos, en la columna NumeroF se coloco desde donde a donde se agruparon las Facturas, también pudieron notar que la Linea 3 no se agrupo con las lineas 6 a la 10, ya que ella esta entre dos numero de facturas que presentan características de contribuyentes, lo que quisiera es que al momento de agrupar predomine primero el orden por NumeroF, luego agrupe todas aquellas lineas en las que sean comunes los NoContribuyentes, respetando la ruptura entre Contribuyentes y NoContribuyentes, asi como se ve desde las Lineas 1 a la 5.

Este es importante para cubrir los requerimientos Tributarios de La ley Venezolana.

Abajo les muestro el codigo con el que estoy haciendo la consulta:

Código SQL [-]
SELECT  Top(10) SAFACT.TipoFac, SAFACT.NumeroP, CASE WHEN SACLIE.TipoCli = 1 THEN SAFACT.Descrip ELSE 'Ventas Diarias' END AS Nombre, 
    CASE WHEN SACLIE.TipoCli = 1 THEN 'Contibuyente' ELSE 'NoContibuyente' END AS TipoCli, 
    CASE WHEN SACLIE.TipoCli = 1 THEN SAFACT.NumeroF ELSE SAFACT.NumeroF+' - '+SAFACT.NumeroF END AS NumeroF, SUM(SAFACT.Monto) AS Monto
FROM  SAFACT LEFT OUTER JOIN
    SACLIE ON SAFACT.CodClie = SACLIE.CodClie
WHERE  (CONVERT(DATETIME, SUBSTRING(CONVERT(VARCHAR, SAFACT.FechaE, 120), 1, 10), 120) = CONVERT(DATETIME, '2011-09-14 00:00:00', 102))
GROUP BY SAFACT.TipoFac, SACLIE.TipoCli, CASE WHEN SACLIE.TipoCli = 1 THEN SAFACT.Descrip ELSE 'Ventas Diarias' END, CONVERT(DATETIME, 
    SUBSTRING(CONVERT(VARCHAR, SAFACT.FechaE, 120), 1, 10), 120), SAFACT.NumeroP, CASE WHEN SACLIE.TipoCli = 1 THEN SAFACT.NumeroF ELSE 'N/A' END, 
    SAFACT.NumeroF, SAFACT.Monto
HAVING  (SAFACT.TipoFac = 'A')
ORDER BY SAFACT.NumeroF

Como verán están involucradas dos tablas, una de donde saco la información del cliente, si es o no contribuyente y de la otra la información del resto de la factura.

Agradeciendo de Antemano el tiempo tomado para leer mi inquietud y también las gracias por ayudarme a resolver este dilema en el que me encuentro.

Atentamente,

Franklin Gonzalez.
Responder Con Cita
  #2  
Antiguo 16-09-2011
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.010
Poder: 20
oscarac Va por buen camino
no los agrupara porque la Columna NumeroF tiene valores diferente
acuerdate que en el Group se colocan los criterios para la agrupacion, pero se debe tener en cuenta los datos

Ejemplo
Cita:
Campo1 Campo2 Campo3
A B 1
C B 2
A C 3
Si agrupo Solo por el Campo1 tendre
Cita:
A 4
C 2
Si Agrupo por el campoA + CampoB tendre
Cita:
Campo1 Campo2 Campo3
A B 1
A C 3
C B 2
Quiza debas encontrar otra condicional para la agrupacion (podria ser tipo de Cliente)
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #3  
Antiguo 16-09-2011
Avatar de orioncomputer
orioncomputer orioncomputer is offline
Miembro
 
Registrado: may 2006
Ubicación: Maturin, Monagas, Venezuela
Posts: 18
Poder: 0
orioncomputer Va por buen camino
Saludos,
Gracias Oscarac por tu pronta respuesta y por tomarte el tiempo para leer mi inquietud.
Yo estoy claro de como funciona la sentencia agrupar, quizás al final debí aclarar que realmente estoy interesado en obtener un resultado como el señalado, no se si quizás hacer dos consultas o utilizar otra forma, pero al resultado que quiero llegar es que me las ordene por "NumeroF" o por lo menos este sea tomado en cuenta para respetar el orden de aparición de los resultados, luego me vaya mostrando bajo la condición "TipoCli" los valores agrupados, solo si este posee el valor de "0" o para los efectos visuales de "NoContribuyente", haga un alto al conseguir un valor "TipoCli = 1" y seguidamente al conseguir valores consecutivos bajo la misma condición, nuevamente me muestre valores agrupados.

Espero haber aclarado o ampliado un poco mas la inquietud señalada.

Gracias mil a todos por detenerse a revisar y aportar sus ideas.
Responder Con Cita
  #4  
Antiguo 16-09-2011
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.010
Poder: 20
oscarac Va por buen camino
entonces me parece que debes utilizar otro recurso

quiza utilizando ClientDataset

tienes tu query donde jalas los datos sin agrupar y en el clientdataset lo vas ordenando de acuerdo a como tu quieres (Adicionando registros, editandolos, etc)
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #5  
Antiguo 16-09-2011
Avatar de orioncomputer
orioncomputer orioncomputer is offline
Miembro
 
Registrado: may 2006
Ubicación: Maturin, Monagas, Venezuela
Posts: 18
Poder: 0
orioncomputer Va por buen camino
Gracias nuevamente por tu pronta respuesta

Realmente lo quería en Sql ya que quería generar una vista e incorporarlo al ReportBuilder, pero voy a buscarle la vuelta creando cortes de control en el ReportBuider a ver como me va, gracias a tu comentario se me ocurre quizás que pueda.

Mil Gracias de Nuevo......
Responder Con Cita
  #6  
Antiguo 26-09-2011
abelg abelg is offline
Miembro
 
Registrado: jul 2004
Posts: 50
Poder: 20
abelg Va por buen camino
con que servidor de base de Datos estas trabajando porque si es Sql Server, se puede hacer, un cursor u otra cosa, nose me dices asi te lo puedo ver que se puede hacer.
Responder Con Cita
  #7  
Antiguo 11-10-2011
Avatar de orioncomputer
orioncomputer orioncomputer is offline
Miembro
 
Registrado: may 2006
Ubicación: Maturin, Monagas, Venezuela
Posts: 18
Poder: 0
orioncomputer Va por buen camino
Hola abelg , bueno ante todo las gracias por interesarte en el tema , te comento que estoy trabajando sobre SQL Server 2008, estoy tratando de que este resultado me lo de en forma dinámica, te explico, necesito crear un reporte para el usuario final en Report Builder , necesito crear una vista o algo que siempre que pida el reporte este actualizado con las facturas que estén en la base de datos, no se si con cursores se pueda armar una vista y no se si esto relentisa el proceso de la base de datos cuando un usuario este pidiendo dicho reporte y el resto este usando la aplicación de manera habitual, ya que la aplicación es cliente servidor y posee varios usuarios conectados en simultaneo elaborando facturas, compras, movimientos de bancos, etc., te comento lo de si se pone lenta la consulta, ya que tengo base de datos que manejan para un mes mas de 3000 registros de factura.

Las mil Gracias por tomarte el tiempo de leer mi inquietud y las gracias nuevamente por querer colaborar conmigo para solucionar esta consulta.
Responder Con Cita
  #8  
Antiguo 12-10-2011
abelg abelg is offline
Miembro
 
Registrado: jul 2004
Posts: 50
Poder: 20
abelg Va por buen camino
Hola, bueno aqui te posteo una solución espero te ayude.

Código SQL [-]
declare @TipoFac varchar(10),
  @NumeroP varchar(20),
  @Nombre varchar(100),
  @TipoCli varchar(50),
  @NumeroReal varchar(15),
  @Monto money,
  -- Para agrupar
  @Grupo int,
  @Nombreanterior varchar(100)
  

Create table #Factura  -- Esta Tabla es una representación de tu tabla real no es necesario crearla
(
  TipoFac varchar(10),
  NumeroP varchar(20),
  Nombre varchar(100),
  TipoCli varchar(50),
  NumeroF varchar(30),
  NumeroReal varchar(15),
  Monto money,
)

Create table #FacturaTmp -- Esta tabla la creas como esta
(
  TipoFac varchar(10),
  NumeroP varchar(20),
  Nombre varchar(100),
  TipoCli varchar(50),
  NumeroReal varchar(15),
  Monto money,
  Grupo int
)

insert into #Factura values('A', 'Z4A8086521', 'COPESIRA, C.A',  'Contibuyente', '00040263', '00040263',   173.400)
insert into #Factura values('A', 'Z4A8086521', 'UNIDAD EDUCATIVA FERMIN TORO', 'Contibuyente', '00040264', '00040264',   338.000)
insert into #Factura values('A', 'Z4A8086521', 'Ventas Diarias', 'NoContibuyente', '00040265 - 00040265','00040265',   267.340)
insert into #Factura values('A', 'Z4A8086521', 'ASOC. COOP. AMBARCA R.L', 'Contibuyente', '00040266', '00040266',   601.450)
insert into #Factura values('A', 'Z4A8086521', 'CONSEJO COMUNAL CRUZ PERAZA I', 'Contibuyente', '00040267', '00040267',   69.360)
insert into #Factura values('A', 'Z4A8086521', 'Ventas Diarias', 'NoContibuyente', '00040268 - 00040268','00040268',   213.740)
insert into #Factura values('A', 'Z4A8086521', 'Ventas Diarias', 'NoContibuyente', '00040269 - 00040269','00040269',   1597.400)
insert into #Factura values('A', 'Z4A8086521', 'Ventas Diarias', 'NoContibuyente', '00040270 - 00040270','00040270',   4.880)
insert into #Factura values('A', 'Z4A8086521', 'Ventas Diarias', 'NoContibuyente', '00040271 - 00040271','00040271',   97.530)
insert into #Factura values('A', 'Z4A8086521', 'Ventas Diarias', 'NoContibuyente', '00040272 - 00040272','00040272',   24.930)

declare FaturaCur Cursor For
Select TipoFac,
         NumeroP,
         Nombre,
         TipoCli,
         NumeroReal,
         Monto
from #Factura
order by NumeroReal

open FaturaCur
fetch next from FaturaCur into @Tipofac, @NumeroP, @Nombre, @TipoCli, @NumeroReal, @Monto
set @Nombreanterior = @Nombre
set @Grupo = 1

while @@FETCH_STATUS = 0 
begin
   if (@Nombreanterior <> @Nombre)
   begin
      set @Grupo = @Grupo + 1
      set @Nombreanterior = @Nombre
   end        
   insert into #FacturaTmp values (@Tipofac, @NumeroP, @Nombre, @TipoCli, @NumeroReal, @Monto, @Grupo)
   fetch next from FaturaCur into @Tipofac, @NumeroP, @Nombre, @TipoCli, @NumeroReal, @Monto                
end

close FaturaCur
deallocate FaturaCur

Select TipoFac,
         NumeroP,
         Nombre,
         TipoCli,
         CASE When MIN(NumeroReal) <> MAX(numeroReal) 
             then  MIN(NumeroReal) +    '-' + MAX(numeroReal) 
             else MIN(NumeroReal) end NumeroFactura,
         SUM(Monto) Monto
from #FacturaTmp
Group by TipoFac,
        NumeroP,
        Nombre,
        TipoCli,
        Grupo
order by
        CASE When MIN(NumeroReal) <> MAX(numeroReal) 
           then  MIN(NumeroReal) +    '-' + MAX(numeroReal)
           else MIN(NumeroReal) end


Drop table #Factura
Drop table #Facturatmp
Mira que estoy creando dos tablas temporales una es para poder simular tu tabla real la otra la uso si para la solución.
salu2

Última edición por abelg fecha: 12-10-2011 a las 16:08:03.
Responder Con Cita
  #9  
Antiguo 13-10-2011
Avatar de orioncomputer
orioncomputer orioncomputer is offline
Miembro
 
Registrado: may 2006
Ubicación: Maturin, Monagas, Venezuela
Posts: 18
Poder: 0
orioncomputer Va por buen camino
Lightbulb

Saludos abelg.

Te estoy muy agradecido por la solucion que me planteastes, te comento que me da el resultado que quiero.

Es magnifica tu respuesta, pero, como nunca falta un pero, la solucion es perfecta, pero no se como implementar tablas temporales y cursor dentro de una vista, te explico el porque de una vista, yo estoy trabajando con un software propietario que obviamente ya esta diseñado y posee una aplicacion para generar reportes o reporteador, que se llama report builder, ya que la aplicacion esta desarrolada en delphi y le agregaron un modulo de reportes para el usuario final, o sea que se pueden hacer reportes adicionales a los que trae el programa, en este yo puedo consultar desde tablas y vistas e incluso constriur sentencias SQL como la que me planteas y de hecho me funciona, mi inquietud ahora serian dos, una no se como pasarle parametros de consulta a la tabla si tuviera que armar la consulta desde SQL en Report Builder y otra un poco la seguridad del trabajo realizado, en el sentido de que si lo hago con una vista, esta yo podria encriptarla y no seria tan comodo saber como esta diseñada, y me protegeria un poco de que se copien el reporte para otra empresa, ya que el software es comercial y somos varios los que damos el soporte a distintos clientes, y este reporte que estoy diseñando seria util para cualquier empresa que maneje este software.

Sin mas a que referir y eternamente agradecido

Saludos....
Responder Con Cita
  #10  
Antiguo 13-10-2011
abelg abelg is offline
Miembro
 
Registrado: jul 2004
Posts: 50
Poder: 20
abelg Va por buen camino
Creo lo que se puede hacer es un procedimiento almacenado, al cual ya lo puedes encriptar y llamarlo como a una vista o en otro caso una función que te retorne una tabla, en ambos casos puedes encriptarlos.

Salu2
Responder Con Cita
  #11  
Antiguo 13-10-2011
Avatar de orioncomputer
orioncomputer orioncomputer is offline
Miembro
 
Registrado: may 2006
Ubicación: Maturin, Monagas, Venezuela
Posts: 18
Poder: 0
orioncomputer Va por buen camino
Ok Nuevamente Gracias y deja entonces investigar al respecto...

Un Saludo...

Deja ver si veo algo que me oriente aca en el foro o el internet de forma general..

Muchas Gracias por tus aportes....
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Pasar Variables de Forma a Forma con delphi.net ASP ASAPLTDA .NET 5 05-07-2007 20:51:31
Como Pasar Variables de Forma a Forma con delphi.net ASP ASAPLTDA Internet 2 02-07-2007 16:26:41
suma condicionada mediante QREXpr u otra solucion ciscu Impresión 6 13-01-2004 18:41:01
Como pasar parametros de una forma hija a otra forma hija luisreg OOP 3 17-09-2003 18:18:50
Agrupar ? ramiretor Impresión 1 16-05-2003 01:51:32


La franja horaria es GMT +2. Ahora son las 03:46:55.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi