'SQL Subquery returned more than 1 value. Already using SELECT TOP 1

I'm trying to use this query (I know its a complex one) but I get an error "subquery cannot return more than 1 value". I've already tried using SELECT TOP as you can see...

Here's the query:

DECLARE @estadoCuota SMALLINT = 2

DECLARE @diasMora SMALLINT = (SELECT TOP 1 Valor FROM SAC.Parametros (NOLOCK) WHERE IdParametro = 4)
DECLARE @diasCobranza SMALLINT = (SELECT TOP 1 Valor FROM SAC.Parametros (NOLOCK) WHERE IdParametro = 9)

SELECT TOP 1 cotizacion.NumeroCredito as ID_Credito
      ,cotizacionCuota.Cuota as Numero_Cuota
      ,CONVERT(DATE, cotizacionCuota.FechaVencimiento, 103) as Fecha_Vencimiento_Cuota
      ,cotizacionCuota.Intereses as Interes_Cuota
      ,cotizacionCuota.Amortizacion as Amortizacion_Cuota
      ,cotizacionCuota.Monto as Valor_Cuota
      ,cotizacionCuota.CapitalPendiente as Saldo_Insoluto_Cuota
      ,(SELECT TOP 1 tipoCuota.Nombre FROM SAC.TipoCuota tipoCuota (NOLOCK) WHERE tipoCuota.IdTipoCuota = producto.IdTipoCuota) as Tipo_Cuota
      ,(SELECT TOP 1 estadoCuota.Nombre FROM SAC.EstadoCuota estadoCuota (NOLOCK) WHERE estadoCuota.IdEstadoCuota = cotizacionCuota.IdEstadoCuota) as Estado_Cuota
      ,CASE WHEN (SELECT TOP 1 estadoCuota.IdEstadoCuota FROM SAC.EstadoCuota estadoCuota (NOLOCK) WHERE estadoCuota.IdEstadoCuota = cotizacionCuota.IdEstadoCuota) = @estadoCuota
        THEN ISNULL(pagoCuota.InteresMora, 0)
        ELSE
            CASE WHEN DATEDIFF(dd, cotizacionCuota.FechaVencimiento, GETDATE()) >= @diasMora
                THEN cotizacionCuota.Monto 
                    * (((SAC.fnTraer_Valor_Mora_tramo(cotizacionCuota.Monto)) / 100) / 30) 
                    * DATEDIFF(dd, cotizacionCuota.FechaVencimiento, GETDATE())
                ELSE 0
            END
       END as Interes_Mora
      ,CASE WHEN (SELECT TOP 1 estadoCuota.IdEstadoCuota FROM SAC.EstadoCuota estadoCuota (NOLOCK) WHERE estadoCuota.IdEstadoCuota = cotizacionCuota.IdEstadoCuota) = @estadoCuota
        THEN ISNULL(pagoCuota.GastosCobranza, 0)
        ELSE 
            CASE WHEN DATEDIFF(dd, cotizacionCuota.FechaVencimiento, GETDATE()) > @diasCobranza
                THEN SAC.fnTraer_Total_Gastos_Cobranza(cotizacionCuota.Monto)
                ELSE 0
            END
       END as Gastos_Cobranza
      ,CASE WHEN (SELECT TOP 1 estadoCuota.IdEstadoCuota FROM SAC.EstadoCuota estadoCuota (NOLOCK) WHERE estadoCuota.IdEstadoCuota = cotizacionCuota.IdEstadoCuota) = @estadoCuota
        THEN  ISNULL(pagoCuota.TotalPagado, 0)
        ELSE
            (CASE
                WHEN (DATEDIFF(dd, cotizacionCuota.FechaVencimiento, GETDATE()) < @diasCobranza AND DATEDIFF(dd, cotizacionCuota.FechaVencimiento, GETDATE()) <= @diasMora)
                THEN cotizacionCuota.Monto
                ELSE 
                    (CASE WHEN DATEDIFF(dd, cotizacionCuota.FechaVencimiento, GETDATE()) < @diasCobranza
                        THEN (cotizacionCuota.Monto 
                            * (((SAC.fnTraer_Valor_Mora_tramo(cotizacionCuota.Monto)) / 100) / 30) 
                            * DATEDIFF(dd, cotizacionCuota.FechaVencimiento, GETDATE()))
                            + cotizacionCuota.Monto 
                        ELSE (cotizacionCuota.Monto 
                            * (((SAC.fnTraer_Valor_Mora_tramo(cotizacionCuota.Monto)) / 100) / 30) 
                            * DATEDIFF(dd, cotizacionCuota.FechaVencimiento, GETDATE()))
                            + SAC.fnTraer_Total_Gastos_Cobranza(cotizacionCuota.Monto)
                            + cotizacionCuota.Monto 
                    END)
                END)
       END as Total_a_Pagar
FROM SAC.Cotizacion cotizacion (NOLOCK)
INNER JOIN SAC.Producto producto (NOLOCK) on producto.IdProducto = cotizacion.IdProducto
INNER JOIN SAC.CotizacionCuota cotizacionCuota (NOLOCK) on cotizacion.IdCotizacion = cotizacionCuota.IdCotizacion
LEFT JOIN SAC.PagoCuota pagoCuota (NOLOCK) on pagoCuota.IdCotizacionCuota = cotizacionCuota.IdCotizacionCuota
WHERE cotizacion.IdEstadoCotizacion in (9, 10, 11) AND producto.Contabilizar = 1
ORDER BY cotizacion.NumeroCredito, cotizacionCuota.Cuota ASC

but I get this error:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression

I've already tried using SELECT TOP 1 on all my selects...

What should I do? What am I doing wrong?



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source