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

Seleccionar una columna, conseguir 4

Estas en el tema de Seleccionar una columna, conseguir 4 en el foro de SQL Server en Foros del Web. Hola, soy bastante nuevo en SQL Server y tengo un problemilla con una consulta. Tengo que realizar un SELECT; stored procedures, functions y views están ...
  #1 (permalink)  
Antiguo 04/08/2009, 05:47
 
Fecha de Ingreso: agosto-2009
Mensajes: 10
Antigüedad: 14 años, 9 meses
Puntos: 0
Seleccionar una columna, conseguir 4

Hola, soy bastante nuevo en SQL Server y tengo un problemilla con una consulta.
Tengo que realizar un SELECT; stored procedures, functions y views están descartados; y cuento con las siguientes tablas:

ProcessType--->CompanyProcess--->ProcessLog

ProcessType p
CompanyProcess cp [con una foreign key (cp.id_process = p.id) ]
ProcessLog pl [con una foreig key (pl.id_companyProcess = cp.id)]

CompanyProcess contiene informaciones sobre recibos, además del tipo de procesos. El tipo de proceso puede ser "paid", "verified", "deleted", etc. Por lo tanto, esta tabla es un registro de todas las operaciones que se hacen con los recibos, ya sean pagos, cancelaciones, etc. Además, en la tabla ProcessLog, se guarda la fecha y la hora en la cual el proceso (cancelación, por ejemplo) fué ejecutado; es decir, borrado, pago, etc.

Lo que necesito es una consulta que extraiga de la tabla ProcessLog la fecha, y las muestre ordenadas en columnas según sea el tipo de proceso, ProcessType.
Gráficamente expuesto, necesito las siguientes columnas:

Como os he comentado anteriormente, estas fechas están en la tbl. ProcessLog, pero ahí están mezclados todos las fechas de tipos de procesos: borrados, pagos, verificaciones, etc... Y según tres tipos de operaciones (payment, deletion, verification) tengo que mostrar esas tres columnas mediante un SELECT y además ordenadas por companyProcessId.

¿Tenéis idea de como puedo solucionar este problema?

Gracias

Última edición por diego_hanseatico; 04/08/2009 a las 06:49
  #2 (permalink)  
Antiguo 04/08/2009, 06:22
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Respuesta: Seleccionar una columna, conseguir 4

podrias poner un ejemplo de los datos que tienes en tus tablas y el resultado que esperas...?

Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #3 (permalink)  
Antiguo 04/08/2009, 06:50
 
Fecha de Ingreso: agosto-2009
Mensajes: 10
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: Seleccionar una columna, conseguir 4

Sí, muchas gracias:

companyProcessId, payment, deletion, verification

PROCESS_TYPE
ID NAME
1 delete
2 cancel
3 payment


COMPANY_PROCESS
ID ID_PROCESS_TYPE ID_INVOICE
1 2 65
2 1 75
3 2 66
4 1 54
5 1 45


PROCESS_LOG
ID ID_COMPANY_PROCESS DATE
1 3 25.12.2009 12:06:14
2 5 25.12.2009 15:05:12
3 2 25.12.2009 18:55:28
4 1 25.12.2009 19:42:15
5 4 25.12.2009 22:21:00


RESULTADO:

INVOICE-NR DATE_DELETION DATE_CANCELLATION DATE_PAYMENT
65 null 25.12.2009 19:42:15 null
75 25.12.2009 18:55:28 null null
66 null 25.12.2009 18:55:28 null
  #4 (permalink)  
Antiguo 04/08/2009, 07:17
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Respuesta: Seleccionar una columna, conseguir 4

Una alternativa seria utilizar subquerys con left join...con los indices correctos deberia operar relativamente bien..

aunque tambien le podemos agregar una tabla temporal para seleccionar la info que en realidad se va a procesar y no estar aplicando los filtros en cada subquery, porque como es una tabla de Log debe tener muchos registros...

Código:
SELECT  INV.INVOICE-NR ,
        DEL.[DATE] AS [DATE_DELETION] ,
        CAN.[DATE] AS [DATE_CANCELLATION] ,
        PAY.[DATE] AS [DATE_PAYMENT] ,
FROM    (
            SELECT   INVOICE-NR
            FROM     PROCESS_LOG
            WHERE    [MICONDITIONS]
            GROUP BY INVOICE-NR 
        ) INV
LEFT JOIN (
            SELECT   INVOICE-NR, [DATE]
            FROM     PROCESS_LOG
            WHERE    [MICONDITIONS] AND
                     ID_COMPANY_PROCESS = 1 
        ) DEL
ON      INV.INVOICE-NR = DEL.INVOICE-NR 
LEFT JOIN (
            SELECT   INVOICE-NR, [DATE]
            FROM     PROCESS_LOG
            WHERE    [MICONDITIONS] AND
                     ID_COMPANY_PROCESS = 2
        ) CAN
ON      INV.INVOICE-NR = CAN.INVOICE-NR 
LEFT JOIN (
            SELECT   INVOICE-NR, [DATE]
            FROM     PROCESS_LOG
            WHERE    [MICONDITIONS] AND
                     ID_COMPANY_PROCESS = 3
        ) PAY
ON      INV.INVOICE-NR = PAY.INVOICE-NR


Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #5 (permalink)  
Antiguo 04/08/2009, 07:50
 
Fecha de Ingreso: agosto-2009
Mensajes: 10
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: Seleccionar una columna, conseguir 4

Muchisimas gracias, compa, me has salvado el tipo!
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 05:23.