¿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 |
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í:
Con este cambio, la salida sería la esperada: