es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo se utiliza String_AGG para hacer consultas con condiciones en SQL?

Tengo 3 tablas con la relación Política (N) -> PolíticaServicio <- Servicio (N):

DXBusinessPolicy_Policy

ID Código Nombre
1 COMBO.2103001 [Giá nền] T9/2020 #1
2 IPTV-0121.002 [Giá nền] T8/2020 #1
3 INT.2103001 Chính sách 2

DXBusinessPolicy_Service

ID Código Nombre
1 INT Internet
2 IPTV IPTV

DXBusinessPolicy_PolicyService

ID IDPolítica IDServicio
1 1 1
2 1 2
3 2 2
4 3 1

La pregunta: ingrese el código de servicio (ServiceCode), la salida son IDPolítica, CódigoPolítica, NombrePolítica y una lista de servicios de esa política (string de la lista ServiceCode unidos por “,”).

Por ejemplo: Mi entrada es: “INT”.
Resultado esperado:

CódigoPolítica NombrePolítica Servicios
COMBO.2103001 [Giá nền] T9/2020 #1 INT,IPTV
INT.2103001 Chính sách 2 INT

Intenté resolver esta pregunta de la siguiente manera:

ALTER PROC FindPolicyByService
    @ServiceCode varchar(200)
AS 
BEGIN
    SELECT dbo.DXBusinessPolicy_Policy.ID AS IDPolítica,
           dbo.DXBusinessPolicy_Policy.Código AS CódigoPolítica,
           dbo.DXBusinessPolicy_Policy.Nombre AS NombrePolítica,
           STRING_AGG(dbo.DXBusinessPolicy_Service.Código, ',') 
    FROM dbo.DXBusinessPolicy_Policy
            join dbo.DXBusinessPolicy_PolicyService ON dbo.DXBusinessPolicy_Policy.ID = dbo.DXBusinessPolicy_PolicyService.IDPolítica
            join dbo.DXBusinessPolicy_Service ON dbo.DXBusinessPolicy_PolicyService.IDServicio = dbo.DXBusinessPolicy_Service.ID
    WHERE dbo.DXBusinessPolicy_Service.Código = @ServiceCode
    GROUP by dbo.DXBusinessPolicy_Policy.ID, dbo.DXBusinessPolicy_Policy.Código, dbo.DXBusinessPolicy_Policy.Nombre
END

exec FindPolicyByService "INT"

Pero el resultado no es el que esperaba:

CódigoPolítica NombrePolítica Servicios
COMBO.2103001 [Giá nền] T9/2020 #1 INT
INT.2103001 Chính sách 2 INT
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema con el procedimiento almacenado actual es que no incorpora el filtro en el código de servicio de entrada al agregar los servicios utilizando la función STRING_AGG. Para solucionar esto, debemos agregar otro filtro dentro de la función STRING_AGG para incluir solo los servicios con el código de servicio deseado.

    El procedimiento almacenado actualizado se vería así:

    ALTER PROC FindPolicyByService
        @ServiceCode varchar(200)
    AS 
    BEGIN
        SELECT p.ID AS PolicyID,
               p.Code AS PolicyCode,
               p.Name AS PolicyName,
               STRING_AGG(s.Code, ',') WITHIN GROUP (ORDER BY s.Code) AS Services
        FROM DXBusinessPolicy_Policy p
        INNER JOIN DXBusinessPolicy_PolicyService ps ON p.ID = ps.PolicyID
        INNER JOIN DXBusinessPolicy_Service s ON ps.ServiceID = s.ID
        WHERE s.Code = @ServiceCode
        GROUP BY p.ID, p.Code, p.Name
    END
    
    EXEC FindPolicyByService 'INT'
    

    Con este cambio, la salida sería la esperada:

    PolicyCode PolicyName Services
    COMBO.2103001 [Giá nền] T9/2020 #1 INT,IPTV
    INT.2103001 Chính sách 2 INT

Comments are closed.