none
CALCULO DENTRO DE CONSULTA RRS feed

  • Pregunta

  • BUENOS DÍAS

    Mi pregunta es la siguiente, tengo una consulta SQL, para crear unas vistas.

    Hasta aquí ningún problema, mi duda surge cuando lo que quiero es hacer un calculo, sobre una tarífa que calculo en una subconsulta. Si leeís el código, realizo una subconsulta para obtener un campo que se encuentra en la tabla "TARIFAVE", tiene un campo de cabecera llamado "Tarifa", en esa columna se encuentra el NOMBRE (tpro,taux,pvp) de dicha tarífa, y el valor que yo quiero obtener es el correspondiente el campo "PRECIO".  Eso ya lo obtengo en el código, y saco un campo que lo llamo "pvp" o "tpro", ahora me gustaría realizar un calculo sobre esas tarifas que yo he llamado así. Por ejemplo, ROUND(PVP-PRCOSTE,2), para poder obtener el MARGEN. No se como hacerlo, puesto que es un valor que obtenido en la misma consulta.

    GRACIAS

    tengo este código:

    SELECT
    
    ARTICULO.CODART , DESCART 'Descripción Artículo', CODPRO as 'Codigo Proveedor', FECALTA as 'FECHA DE ALTA', PRCCOMPRA 'PRECIO COMPRA BRUTO', ULTDESC1 as '%DTO 1', ULTDESC2 as '%DTO 2', ULTDESC3 as '%DTO 3',  ULTPRCCOMNETPAL as 'PRECIO DE COMPRA NETO', PRCSTANDARD as 'PRECIO ESTANDARD', 
    (SELECT isnull(sum(STOCKALM.UNIDADES),'0') unidades
    FROM STOCKALM
    WHERE STOCKALM.CODART = ARTICULO.CODART and ltrim(stockalm.CODALM)='2')  
    AS 'STOCK FARMACIA',
    (SELECT isnull(sum(STOCKALM.UNIDADES),'0') unidades
    FROM STOCKALM
    WHERE STOCKALM.CODART = ARTICULO.CODART and ltrim(stockalm.CODALM)='1')  
    AS 'STOCK FARMAPARA',
    (SELECT TARIFAVE.PRECIO  
    FROM TARIFAVE
    WHERE TARIFAVE.CODART = ARTICULO.CODART and ltrim(tarifave.TARIFA)='TPRO')
    AS 'TPRO',
    (SELECT TARIFAVE.PRECIO  
    FROM TARIFAVE
    WHERE TARIFAVE.CODART = ARTICULO.CODART and ltrim(tarifave.TARIFA)='PVP')
    AS 'PVP'
    from dbo.ARTICULO
    
    ORDER BY CODART ASC  

    da como resultado (pongo una línea como ejemplo):

                  0	Articulo sin codificar	NULL	2003-01-29 00:00:00.000	0	0.0000	0.0000	0.0000	0,01	0,0121	0,99	0	0	0	NULL



    lunes, 14 de mayo de 2018 11:48

Respuestas

Todas las respuestas

  • Sin leer mucho la sentencia, para estos casos recomendaria una expresion de tabla comun (CTE) o una tabla derivada.

    WITH R as (
    Aca tu query sin la clausula ORDER BY (para ordenar resultado al cliente), la cual carece de sentido cuando se usa en la definicion de una vista
    )
    select col1, ...coln, ROUND(PVP-PRCOSTE,2) as margen
    from R;

    Lo mismo seria usar una tabla derivada:

    select col1, ...coln, ROUND(PVP-PRCOSTE,2) as margen
    from (
    Aca tu query sin la clausula ORDER BY (para ordenar resultado al cliente), la cual carece de sentido cuando se usa en la definicion de una vista
    ) as R;


    AMB

    Some guidelines for posting questions...

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

    lunes, 14 de mayo de 2018 12:07
  • Hola:

    Además de lo que te ha expresado Huchback, yo he mirado un poco la consulta y creo que tienes que establecer las relaciones, directamente, y puedes extraer los datos.

    SELECT
    
    A.CODART , DESCART 'Descripción Artículo', CODPRO as 'Codigo Proveedor', FECALTA as 'FECHA DE ALTA', PRCCOMPRA 'PRECIO COMPRA BRUTO', ULTDESC1 as '%DTO 1', ULTDESC2 as '%DTO 2', ULTDESC3 as '%DTO 3',  ULTPRCCOMNETPAL as 'PRECIO DE COMPRA NETO', PRCSTANDARD as 'PRECIO ESTANDARD', 
    ,isnull(sum(M.UNIDADES),'0') unidades,isnull(sum(M2.UNIDADES),'0') unidades
    ,V.PRECIO AS TPRO, V2.PRECIO AS PVP
    from articulo a
    INNER JOIN TARIFAVE V ON V.CODART = A.CODART and ltrim(V.TARIFA)='TPRO')
    INNER JOIN TARIFAVE V2 ON V.CODART = A.CODART AND ltrim(tarifave.TARIFA)='PVP')
    LEFT join stockalm m on (a.codart = m.codart and ltrim(stockalm.CODALM)='2')
    LEFT join stockALM M2 ON (STOCKALM.CODART = ARTICULO.CODART and ltrim(stockalm.CODALM)='1') 
     
     GROUP BY 
     A.CODART , DESCART , CODPRO , FECALTA , PRCCOMPRA , ULTDESC1 , ULTDESC2, ULTDESC3 ,  ULTPRCCOMNETPAL , PRCSTANDARD, V.PRECIO, V2,PRECIO 
    
    ORDER BY CODART ASC  

    No se si habrá algún error de sintaxis, ni siquiera si lo que quieres obtener de tu stockaje es para todos los articulos independientemente de que tenga stock o no por almacen, o por el contrario es un inner join, porque solo sacamos los articulos con stock.

    Pero a mi jucio con esto te puede ayudar.

    Un saludo

    lunes, 14 de mayo de 2018 13:49