Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-04-2011
amerika111 amerika111 is offline
Miembro
 
Registrado: nov 2009
Posts: 168
Poder: 0
amerika111 cantidad desconocida en este momento
pues trate de hacerlo asi pero nop no error tras error....

WITH EMPLEADO_ID AS (
SELECT NOMBRE_COMPLETO,PUESTO_NO_ID,DEPTO_NO_ID,SALARIO_DIARIO
FROM EMPLEADOS
GROUP BY EMPLEADOS.EMPLEADO_ID
)
SELECT DISTINCT DIAS_TRAB,HORAS_TRAB,HORAS_EXT,FORMA_PAGO
FROM PAGOS_NOMINA
LEFT JOIN EMPLEADOS
ON PAGOS_NOMINA.EMPLEADO_ID = EMPLEADOS.EMPLEADO_ID
LEFT JOIN PAGOS_NOMINA_DET
ON CONCEPTOS_NO.CONCEPTO_NO_ID=PAGOS_NOMINA_DET.CONCEPTO_NO_ID ;




subo el diagrama que mas o menos lo tengo asi... para saber si se puede realizar, con este codigo me despliega todos los conceptos del empleado en forma de filas si cuenta con 8 conceptos repite al empleado 8 veces por que cada concepto viene con empleadoid, entonces por eso queria ver la forma de pasar los conceptos a columnas y que empleados aparecienran en filas.

SELECT * FROM CONCEPTOS_NO INNER JOIN PAGOS_NOMINA_DET
on PAGOS_NOMINA_DET.CONCEPTO_NO_ID = CONCEPTOS_NO.CONCEPTO_NO_ID INNER JOIN EMPLEADOS
ON EMPLEADOS.EMPLEADO_ID = PAGOS_NOMINA_DET.EMPLEADO_ID INNER JOIN PAGOS_NOMINA
ON EMPLEADOS.EMPLEADO_ID = PAGOS_NOMINA.EMPLEADO_ID where PAGOS_NOMINA.NOMINA_ID=83858

Última edición por amerika111 fecha: 29-07-2011 a las 01:07:25.
Responder Con Cita
  #2  
Antiguo 07-04-2011
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.015
Poder: 22
oscarac Va por buen camino
mmmm que base de datos Usas?
quiza sea absurda la pregunta pero quiero estar seguro
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #3  
Antiguo 07-04-2011
amerika111 amerika111 is offline
Miembro
 
Registrado: nov 2009
Posts: 168
Poder: 0
amerika111 cantidad desconocida en este momento
Cita:
Empezado por oscarac Ver Mensaje
mmmm que base de datos Usas?
quiza sea absurda la pregunta pero quiero estar seguro
Microsip con firebird
Responder Con Cita
  #4  
Antiguo 08-04-2011
Gallosuarez Gallosuarez is offline
Miembro
 
Registrado: feb 2007
Posts: 92
Poder: 20
Gallosuarez Va por buen camino
Talking Sugerencia ...

amerika111:

Lo sorprendente sería que dijeras que ese código te hubiera funcionado. Mira, no creo que estés entendiendo el concepto de CTE's (veo que, además de estar pésimamente implementado, el concepto no se está entendiendo).

Por otro lado, en este mismo foro ya se había tratado este tema con anterioridad. El compañero fjcg02 mencionó entonces en aquella ocasión que utilizar CTE's no resolvía el problema si existían varios conceptos. Lo cual no es un problema, puesto que se resuelve utilizando bloques ejecutables (Execute Block). Que es mas o menos lo que él hace en dicho procedimiento almacenado, con la diferencia que el código resultante es sumamente robusto y eficiente (amen de ser una solución elegante). Otra cosa, el código completo se puede armar desde la misma aplicación (ventaja de hacerlo con Execute block).

Bueno, hecha esta aclaración le digo a amerika111 que primero tiene que entender bien el concepto. Resolver su problema no debe de llevarse mucho tiempo.

Saludos,
Gerardo Suárez Trejo
PD. Estoy creando tutoriales que tratan todas estas cuestiones ... espero pronto subirlos para haber si les puede ser útiles a alguien... saludos nuevamente ...
Responder Con Cita
  #5  
Antiguo 08-04-2011
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.418
Poder: 24
fjcg02 Va camino a la fama
bbbbbbbbbbbbbbbbbbbbbbbbbb
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #6  
Antiguo 08-04-2011
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.418
Poder: 24
fjcg02 Va camino a la fama
Cita:
Empezado por fjcg02 Ver Mensaje
bbbbbbbbbbbbbbbbbbbbbbbbbb
Llevo un rato intentando entender el WITH este del demonio, y no acabo de cogerle el punto ...
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #7  
Antiguo 08-04-2011
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 26
guillotmarc Va por buen camino
En mi opinión os estáis complicando mucho. Solucionarlo con subconsultas normalmente es bastante sencillo (claro que solo se puede hacer cuando el nº de columnas está prefijado de antemano).

Sería algo del tipo :

Código SQL [-]
select mes
         (select sum(unidades) from ventas where ventas.mes = meses.mes and producto = 'A') as ventas_A,
         (select sum(unidades) from ventas where ventas.mes = meses.mes and producto = 'B') as ventas_B,
         (select sum(unidades) from ventas where ventas.mes = meses.mes and producto = 'C') as ventas_C
from meses

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #8  
Antiguo 08-04-2011
amerika111 amerika111 is offline
Miembro
 
Registrado: nov 2009
Posts: 168
Poder: 0
amerika111 cantidad desconocida en este momento
no pues sigo en las mismas, ya hasta regañada sali,


trate de hacerlo con lo de CTE's pero nada no se como utilizar lo que me han comentado del case o la subconsulta

Código SQL [-]
with tabla as
(select PAGOS_NOMINA_DET.PAGO_NOMINA_ID, PAGOS_NOMINA_DET.CONCEPTO_NO_ID,CONCEPTOS_NO.NOMBRE,PAGOS_NOMINA_DET.IMPORTE,EMPLEADO_ID FROM PAGOS_NOMINA_DET  INNER JOIN  CONCEPTOS_NO
on CONCEPTOS_NO.CONCEPTO_NO_ID = PAGOS_NOMINA_DET.CONCEPTO_NO_ID  )
SELECT (NOMBRE from tabla WHERE ) FROM tabla
select IMPORTE
       (SELECT IMPORTE from tabla where CONCEPTO_NO_ID =104) as 'SALARIO MIN'
FROM tabla
Responder Con Cita
  #9  
Antiguo 09-04-2011
amerika111 amerika111 is offline
Miembro
 
Registrado: nov 2009
Posts: 168
Poder: 0
amerika111 cantidad desconocida en este momento
Código SQL [-]
with tabla as
(select PAGOS_NOMINA_DET.PAGO_NOMINA_ID, PAGOS_NOMINA_DET.CONCEPTO_NO_ID,CONCEPTOS_NO.NOMBRE,PAGOS_NOMINA_DET.IMPORTE,EMPLEADO_ID FROM PAGOS_NOMINA_DET  INNER JOIN  CONCEPTOS_NO
on CONCEPTOS_NO.CONCEPTO_NO_ID = PAGOS_NOMINA_DET.CONCEPTO_NO_ID  )

select IMPORTE
       (SELECT IMPORTE from tabla where CONCEPTO_NO_ID =104) as 'SALARIO MIN'
FROM tabla
Responder Con Cita
  #10  
Antiguo 10-04-2011
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 23
RONPABLO Va por buen camino
Yo hago algo parecido y me toca que construirlo desde delphi, yo hago algo así como esto:

Código Delphi [-]

   sql := '';
   while not QConceptos.Eof do
   begin
      if sql <> '' then
        sql := sql + ',';
      Concepto := QConceptos.FieldByName('Concepto').AsString;
      sql := sql + ' Case when Campo = ' + QuotedStr(Concepto) + ' THEN campoimporte else 0 end as ' + Concepto
      QConceptos.Next;
   end;
  
   sql := 'Select Id_empleado, ' +  sql + ' from ....'


Donde el query QConceptos es el siguiente:
Código SQL [-]

   Select distinct Concepto from Conceptos


Todo esto lo hago sin comprobar, es solo para dar una idea de como lo hago.
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H"

Última edición por RONPABLO fecha: 10-04-2011 a las 20:07:50.
Responder Con Cita
  #11  
Antiguo 10-04-2011
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 23
RONPABLO Va por buen camino
Cita:
Empezado por guillotmarc Ver Mensaje
En mi opinión os estáis complicando mucho. Solucionarlo con subconsultas normalmente es bastante sencillo (claro que solo se puede hacer cuando el nº de columnas está prefijado de antemano).

Sería algo del tipo :

Código SQL [-]
select mes
          (select sum(unidades) from ventas where ventas.mes = meses.mes and producto = 'A') as ventas_A,
          (select sum(unidades) from ventas where ventas.mes = meses.mes and producto = 'B') as ventas_B,
          (select sum(unidades) from ventas where ventas.mes = meses.mes and producto = 'C') as ventas_C 
from meses

Saludos.

Viendo esta respuesta creo que combinándola con mi respuesta anterior podría también funcionar muy bien.
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H"
Responder Con Cita
  #12  
Antiguo 18-03-2015
Avatar de mRoman
mRoman mRoman is offline
Miembro
 
Registrado: nov 2003
Posts: 646
Poder: 23
mRoman Va por buen camino
Cita:
Empezado por guillotmarc Ver Mensaje
En mi opinión os estáis complicando mucho. Solucionarlo con subconsultas normalmente es bastante sencillo (claro que solo se puede hacer cuando el nº de columnas está prefijado de antemano).

Sería algo del tipo :

Código SQL [-]
select mes
         (select sum(unidades) from ventas where ventas.mes = meses.mes and producto = 'A') as ventas_A,
         (select sum(unidades) from ventas where ventas.mes = meses.mes and producto = 'B') as ventas_B,
         (select sum(unidades) from ventas where ventas.mes = meses.mes and producto = 'C') as ventas_C
from meses

Saludos.
Hola guillotmarc, en que version de firebird puedes hacer esto?

Uso la version 2.0
__________________
Miguel Román

Afectuoso saludo desde tierras mexicanas....un aguachile?, con unas "cetaseas" bien "muertas"?, VENTE PUES !!
Responder Con Cita
  #13  
Antiguo 08-04-2011
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.418
Poder: 24
fjcg02 Va camino a la fama
Hola de nuevo,
estoy haciendo unas pruebas, y la verdad, no me están convenciendo. A no ser que esté haciendo algo mal, y que agradecería que me lo indicarais si alguien lo sabe.

Mi intención es sacar una consulta con las poblaciones y los estados civiles de los clientes. La tabla es de clientes, en donde hay id, nombre, población y estado civil. La tabla tiene 16.500 registros. Existen 4 estados civiles ,a saber: CASADO, SOLTERO, SIN DEF. y VIUDO ( tened en cuenta que no está en producción, son pruebas ).

Una primera consulta sería
Código SQL [-]
select poblacion,
sum ( case when estadocivil='CASADO' then 1 ELSE 0 END) AS CASADO,
sum ( case when estadocivil='SOLTERO' then 1 ELSE 0 END) AS SOLTERO,
sum ( case when estadocivil='SIN DEF.' then 1 ELSE 0 END) AS SINDEF,
sum ( case when estadocivil='VIUDO' then 1 ELSE 0 END) AS VIUDO
from cliente
group by poblacion

Respuesta perfecta, tiempo de consulta aprox 3 segundos.

Utilizando WITH

Código SQL [-]
 with
  estadosciviles as (
    select estadocivil as EC, count(idcliente) as NUMERO
    from cliente
    group by estadocivil)
    select poblacion,
    ECC.numero as CASADOS,
    ECS.numero as SOLTEROS,
    ECSD.numero as SINDEF,
    ECV.numero as VIUDOS
    from cliente  C
    left join estadosciviles ECC on C.estadocivil=ECC.EC
    and ECC.EC='CASADO'
    left join estadosciviles ECS on C.estadocivil=ECS.EC
    and ECS.EC='SOLTERO'
    left join estadosciviles ECSD on C.estadocivil=ECSD.EC
    and ECSD.EC='SIN DEF.'
    left join estadosciviles ECV on C.estadocivil=ECV.EC
    and ECV.EC='VIUDO'

Resultado inexacto. Me devuelve más de una fila por población, y datos un poco extraños.
Tiempo de respuesta. Me deja el equipo cuajado un par de minutos al menos.

Me da la sensación de que estoy haciendo mal la consulta. A ver si alguien me puede poner luz...

Gracias
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #14  
Antiguo 08-04-2011
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 26
guillotmarc Va por buen camino
Hola.

Si en tu primero consulta, sencilla, ya obtienes el resultado el resultado que estás buscando, y en un tiempo óptimo, ¿ porqué te quieres complicar la vida sacándolo mediante CTE's ?.

NOTA: Para agilizar un poco más esa primera consulta, puedes añadir un índice por población (de esa forma facilitas la agrupación por ese campo).

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #15  
Antiguo 08-04-2011
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.418
Poder: 24
fjcg02 Va camino a la fama
Cita:
Empezado por guillotmarc Ver Mensaje
Hola.

Si en tu primero consulta, sencilla, ya obtienes el resultado el resultado que estás buscando, y en un tiempo óptimo, ¿ porqué te quieres complicar la vida sacándolo mediante CTE's ?.

NOTA: Para agilizar un poco más esa primera consulta, puedes añadir un índice por población (de esa forma facilitas la agrupación por ese campo).

Saludos.
Hola,
estoy comparando la manera de obtener los datos, con la primera consulta ( que la creo dinámicamente con una procedure ) o con CTE's.
La segunda opción me está dando un rendimiento muy pobre, de ahí mi consulta de si estoy haciendolo bien o no.

Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #16  
Antiguo 08-04-2011
Gallosuarez Gallosuarez is offline
Miembro
 
Registrado: feb 2007
Posts: 92
Poder: 20
Gallosuarez Va por buen camino
Talking Sugerencia ...

Cita:
Empezado por guillotmarc Ver Mensaje
Hola.
Si en tu primero consulta, sencilla, ya obtienes el resultado el resultado que estás buscando, y en un tiempo óptimo, ¿ porqué te quieres complicar la vida sacándolo mediante CTE's ?.
No estoy muy de acuerdo en que utilizar CTE's te compliques la vida ... hagamos lo siguiente:

fjcg02 puedes poner la estructura de tus tablas (algo así como lo que hizo amerika111, en un archivo gpeg como el que ella subio). Después hacemos el ejercicio y verán que es muy fácil.

El secreto está primero en programar la "tabla" que te servirá de pivote ... posteriormente lo único que tienes que hacer es llamarla las veces que necesites dependiendo de los "conceptos" que quieras que aparezcan en las columnas ... ¿me explico?.

Saludos
Gerardo Suárez Trejo

Última edición por Gallosuarez fecha: 08-04-2011 a las 16:51:06. Razón: Corregir ...
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Consulta con Filas en Columnas afxe SQL 3 30-01-2011 14:52:18
Consulta de Filas y Columnas mjjj SQL 1 19-02-2010 22:24:36
Filas y Columnas pmcastilla Varios 2 07-12-2007 20:22:01
ocultar filas o columnas karla Servers 1 10-08-2006 20:03:18
Filas a columnas nightynvid MS SQL Server 0 31-05-2006 16:22:44


La franja horaria es GMT +2. Ahora son las 21:37:51.


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