none
Múltiples parámetros con campos calculados RRS feed

  • Pregunta

  • Hola a todos,

    Estoy seleccionando un grupo de registros de una tabla que tengo que compararlo con otra, pero aplican varios criterios, ejemplo:

    En la tabla que necesito hacer las comparaciones tengo una columna con cantidades, y tengo 3 tablas más que se comparan con la principal y se representa de la siguiente manera:

    TablaPrincipal contiene una columna con montos a comparar.

    En la tabla1 tiene una columna con montos y aplico el siguiente calculo (TablaPrincipal.monto - Tabla1.monto), esta columna no tiene campos repetidos.

    En la tabla2 tengo 2 o más registros con un campo común y necesito hacer las siguientes comparaciones: 

       - La suma de los montos no puede exceder lo establecido en la TablaPrincipal.monto

       - En caso de que la suma exceda lo establecido en la TablaPrincipal.Monto y haya más de un registro, verificar si ninguno de los dos se puede seleccionar porque excede el monto, en caso contrario escoger sólo uno e igualar el monto de la TablaPrincipal.Monto.

    He probado diferentes formas para estructurar el query, pero no he podido completar hacer todo lo que necesito en la tabla2.

    También quiero aclarar que mi versión del motor de SQL es 2005.

    Espero que puedan ayudarme.

    Gracias.


    Ramón Santiago Zoquier Gómez

    lunes, 12 de diciembre de 2016 1:39

Respuestas

  • Ramón Zoquier,

    La ausencia de aportes suele ser porque la definición del problema o la exposición de los resultados esperados no son claros, y cuando el problema es algo complejo y la redacción no alcanza es recomendable que eches mano a algún recurso que permita facilitar el entendimiento del caso, en lo personal no me queda claro lo que requieres. Te recomiendo que hagas una pequeña tabla con datos de ejemplo y diseñes otra con los resultados que esperas, para eso podrías usar Ms-Excel para simular los datos y resultados.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 13 de diciembre de 2016 16:24

Todas las respuestas

  • Alguien puede ayudarme?

    Ramón Santiago Zoquier Gómez

    lunes, 12 de diciembre de 2016 10:10
  • Te recomiendo que postees la estructura de las tablas involucradas (solo columnas necesarias), data de ejemplo y resultados esperados.

    Ayudanos para poder ayudarte.


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    lunes, 12 de diciembre de 2016 13:33
  • Gracias por responder AMB, entonces les dejo la estructura de las tablas con data de ejemplo.

    TABLA PRINCIPAL

    cedula            monto

    0010000002            11500.00

    TABLA1

    cedula                    idcuenta

    0010000002        00152658

    TABLA2

    cedula                    idcuenta             monto

    0010000002          00152493         500.00

    0010000002          00152805         1000.00

    Lo que necesito hacer extraer comparar de la tabla principal con los valores de la tabla3 nunca excediendo del monto establecido en la tabla principal ejemplo,

    SELECT TABLAPRINCIPAL.CEDULA, TABLAPRINCIPAL.MONTO - TABLA3.MONTO AS MONTO1, TABLA3.MONTO AS MONTO2

    El MONTO1 será cero siempre y cuando no existan valores en la TABLA2.

    El MONTO2 no podrá exceder de lo especificado en la TABLAPRINCIPAL.monto, si existen valores en la tabla2 entonces la sumatoria de MONTO1 + MONTO2 debe ser igual a TABLAPRINCIPAL.monto.

    El Como pueden ver en la TABLA2 hay dos registros, si la suma de ambos mas el MONTO1 ES IGUAL A TABLAPRINCIPAL.MONTO entonces extraería ambos registros, de lo contrario solo tomaría un solo registro e igualaría el monto a TABLAPRINCIPAL.MONTO siempre y cuando hayan registros en la TABLA2 SINO sería igual a TABLAPRINCIPAL.MONTO.

    He intentado hacer algo como esto:

    SELECT TABLAPRINCIPAL.CEDULA, 
    'MONTO1' = CASE WHEN  ISNULL(TABLA2.CEDULA,0) = 0 THEN 0 ELSE TABLAPRINCIPAL.MONTO - TABLA3.MONTO, 
    'MONTO2' = CASE WHEN TABLA3.MONTO < TABLAPRINCIPAL.MONTO THEN TABLAPRINCIPAL.MONTO ELSE TABLA3.MONTO
    END
    FROM TABLAPRINCIPAL
    INNER JOIN TABLA3
    ON TABLAPRINCIPAL.CEDULA = TABLA3.CEDULA
    INNER JOIN TABLA2
    ON TABLAPRINCIPAL.CEDULA = TABLA2.CEDULA

    Sin éxito, espero que puedan ayudarme.


    Ramón Santiago Zoquier Gómez

    lunes, 12 de diciembre de 2016 16:42
  • no son unos requisitos nada claros Ramón, tienes que entender que nosotros no estamos en tu mente, y no vemos que es lo que te preocupa. en cualquier caso si te he entendido, quizá algo así pueda valerte.

    create table #principal (cedula char(20),monto money)
    create table #tabla2 (linea int identity(1,1),cedula char(20),cuenta char(20),monto money)
    insert into #principal values ('0010000002',11500);
    insert into #tabla2 values ('0010000002','00152658',1000),('0010000002','00152658',1000),('0010000002','00152658',1000),
    					  ('0010000002','00152658',1000),('0010000002','00152658',1000),('0010000002','00152658',1000),
    					  ('0010000002','00152658',1000),('0010000002','00152658',1000),('0010000002','00152658',1000),
    					  ('0010000002','00152658',1000),('0010000002','00152658',1000),('0010000002','00152658',1000),
    					  ('0010000002','00152658',1000),('0010000002','00152658',1000),('0010000002','00152658',1000),
    					  ('0010000002','00152658',1000),('0010000002','00152658',1000),('0010000002','00152658',1000)
    ;
    with t2conAcum as (
    select *, sum(monto) over( partition by cedula,cuenta order by linea) acum from #tabla2
    )
    select * from #principal p inner join t2conAcum t2 on p.cedula=t2.cedula where acum<=p.monto
    
    
    drop table #principal
    drop table #tabla2


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    lunes, 12 de diciembre de 2016 17:27
    Moderador
  • Perdón por no darme a entender, intentaré explicarlo mejor.

    Tengo almacenada la siguiente información en estas tablas:

    create table #principal (cedula char(20),monto money)
    create table #tabla2 (cedula char(20),cuenta char(20),monto money)
    insert into #principal values ('0020000002',500);
    insert into #tabla2 values ('0020000002','00252653',250),('0020000002','00152658',300)

    Lo que necesito hacer es seleccionar un solo registro de la #tabla2.monto e igualar el monto de la tabla #principal.monto, ya que ambos registros sobrepasan el monto de la tabla principal, quisiera saber cómo puedo hacer eso.

    Gracias.


    Ramón Santiago Zoquier Gómez


    • Editado Ramón Zoquier lunes, 12 de diciembre de 2016 19:23 equivoco
    lunes, 12 de diciembre de 2016 19:21
  • Alguien puede ayudarme?

    Ramón Santiago Zoquier Gómez

    lunes, 12 de diciembre de 2016 22:26
  • Ramón Zoquier,

    La ausencia de aportes suele ser porque la definición del problema o la exposición de los resultados esperados no son claros, y cuando el problema es algo complejo y la redacción no alcanza es recomendable que eches mano a algún recurso que permita facilitar el entendimiento del caso, en lo personal no me queda claro lo que requieres. Te recomiendo que hagas una pequeña tabla con datos de ejemplo y diseñes otra con los resultados que esperas, para eso podrías usar Ms-Excel para simular los datos y resultados.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 13 de diciembre de 2016 16:24