none
Información del Subquery erronea RRS feed

  • Pregunta

  • Hola buenas tardes, tengo un query en donde tengo varios campos, y necesito agregar un subquery para agregar una columna el cual necesito sumarla y lo estoy haciendo así para que no me pida agruparla por todos los demás campos. Pero el error esta que al momento de agregar mi subquery y la suma este me esta trayendo una suma exagerada y no se de donde sale un valor tan grande, ya que al hacer un select solo a LineTotal me trae los datos reales y los valores no coinciden. Alguien sabe proque? o si tengo mal mi query estoy tratando de traerme mis facturas de reserva. 

    SELECT DISTINCT
    T0.[CardCode],
    T0.[CardName],
    T0.[DocNum],
    T0.[DocEntry],
    T0.[DocDate],
    T2.[SlpName],
    ((SELECT COALESCE(SUM(S0.[LineTotal]),0) FROM INV1 S0 INNER JOIN OINV S1 ON S0.[DocEntry] = S1.[DocEntry] WHERE S1.CANCELED='N'  AND S0.ItemCode = T3.ItemCode  )) AS 'Total Líneas' 
    
    
    FROM OINV  T0
    LEFT JOIN INV1 T1 ON T0.[DocEntry] = T1.[DocEntry]
    LEFT JOIN OSLP T2 ON T0.[SlpCode] = T2.[SlpCode]
    LEFT JOIN OITM T3 ON T1.[ItemCode] = T3.[ItemCode] 
    
    
    
    WHERE T0.[DocStatus]  = 'O'
    AND T0.[CANCELED]  = 'N'
    AND T0.[isIns] = 'Y'

     



    • Editado Louisa_E martes, 9 de julio de 2019 17:46
    lunes, 8 de julio de 2019 17:48

Todas las respuestas

  • Hola Eliza_09:

    Es muy difícil, ayudarte sin saber cuales son las relaciones entre las tablas.

    pero a priori hay podrías intentar esto.

    Código 1 

    SELECT DISTINCT
    T0.[CardCode],
    T0.[CardName],
    T0.[DocNum],
    T0.[DocEntry],
    T0.[DocDate],
    T2.[SlpName],
    ((SELECT COALESCE(SUM(S0.[LineTotal]),0) 
        FROM INV1 S0 
    	   INNER JOIN OINV S1 ON S0.[DocEntry] = S1.[DocEntry] 
    		  WHERE 
    				S1.CANCELED='N'  
    			 AND S0.ItemCode = T1.ItemCode  )) AS 'Total Líneas' 
    
    
    FROM OINV  T0
    LEFT JOIN INV1 T1 ON T0.[DocEntry] = T1.[DocEntry]
    LEFT JOIN OSLP T2 ON T0.[SlpCode] = T2.[SlpCode]
    --LEFT JOIN OITM T3 ON T1.[ItemCode] = T3.[ItemCode] 
    WHERE T0.[DocStatus]  = 'O'
    AND T0.[CANCELED]  = 'N'
    AND T0.[isIns] = 'Y'

    Si ya tienes itemCode en t1, no hace falta obtener t3. Relaciona la subconsulta con t1.itemCode.

    Si en realidad INV1 tiene las líneas de inventario (me supongo), y OITM tiene también múltiples líneas de "algo" para los mismos ítems, entonces, tendrás que utilizar una función de agregación para extraer un solo valor para este conjunto, por cada ítem (o del reves, para inv1)

    Código 2

    SELECT DISTINCT
    T0.[CardCode],
    T0.[CardName],
    T0.[DocNum],
    T0.[DocEntry],
    T0.[DocDate],
    T2.[SlpName],
    O.[TOTAL LINEAS]
    
    
    FROM OINV  T0
    LEFT JOIN INV1 T1 ON T0.[DocEntry] = T1.[DocEntry]
    LEFT JOIN OSLP T2 ON T0.[SlpCode] = T2.[SlpCode]
    CROSS APPLY (
    SELECT COALESCE(SUM(S0.[LineTotal]),0)  AS [TOTAL LINEAS]
        FROM INV1 S0 
    	   INNER JOIN OINV S1 ON S0.[DocEntry] = S1.[DocEntry] 
    		  WHERE 
    				S1.CANCELED='N'  
    			 AND S0.ItemCode = T1.ItemCode  
    ) AS O
    WHERE T0.[DocStatus]  = 'O'
    AND T0.[CANCELED]  = 'N'
    AND T0.[isIns] = 'Y'

    Cuando tengas resuelto el tema de los conjuntos, puedes cambiar la subconsulta por el operador Cross apply, si  solo quieres la suma de líneas total para los ítems que dispongan de inv. (o en su defecto de OITM). 

    También puedes cambiar el Cross Apply por Outer apply, si deseas que salga aunque no tenga líneas.

    lunes, 8 de julio de 2019 20:47
  • Sigue sin funcionar, abra una forma de sacar la sumatoria y agregarla normal sin el subquery se podrá con una tabla

    o algo así? Ya busque por todos lados e intente lo de arriba pero no funciona. 

    (SUM(S0.[LineTotal])



    • Editado Louisa_E martes, 9 de julio de 2019 18:02
    martes, 9 de julio de 2019 14:23
  • Deleted
    martes, 9 de julio de 2019 17:34
  • SELECT DISTINCT
    T0.[CardCode],
    T0.[CardName],
    T0.[DocNum],
    T0.[DocEntry],
    T0.[DocDate],
    T1.[SlpName],
    ((SELECT T1.[CardCode], COALESCE(SUM(T0.[LineTotal]),0) FROM INV1 T0  INNER JOIN OINV T1 ON T0.[DocEntry] = T1.[DocEntry] WHERE T0.[SlpCode] = T1.[SlpCode] AND T1.CANCELED='N'
    AND T1.[isIns] = 'Y' AND T1.[DocStatus] = 'O' GROUP BY T1.[CardCode])) AS 'Líneas Totales'
    
    FROM [dbo].[OINV]  T0 
    INNER JOIN [dbo].[OSLP]  T1 ON T0.[SlpCode] = T1.[SlpCode] 
    
    
    WHERE T0.[DocStatus] = 'O'
    AND T0.[CANCELED] = 'N'
    AND T0.[isIns] = 'Y'
    Tengo este código pero me sale este error only one expression can be specified in the select list when the subquery is not introduced  with exists alguien sabe porque? 


    • Editado Louisa_E miércoles, 10 de julio de 2019 18:58
    miércoles, 10 de julio de 2019 18:40
  • Hola Elii_09:

    No puedes ir variando al azar el código, porque eso no te va a funcionar.

    SELECT T1.[CardCode], COALESCE(SUM(T0.[LineTotal]),0)

    Esa subconsulta no puede reportar dos columnas tal cual lo has puesto, solo puede devolver 1, de ahí el error.

    Si quieres utilizar subconsultas, (no recomendable), cada columna tiene que devolver un solo valor.

    miércoles, 10 de julio de 2019 19:57