La mejor manera de lograr la matriz de exclusión a través de consultas
-
06-07-2019 - |
Pregunta
¿Cuál es la mejor manera de lograr esta matriz de exclusión a través de la consulta?
Hay un número fijo de productos en una tabla y la idea es que si un producto se vende a un cliente (representado por una fila), los otros productos (columnas) pueden o no venderse según la matriz de reglas a continuación. El objetivo es obtener el código de los productos que se pueden vender para cualquier código de producto vendido.
ProductCode|MRLSPN|MRLSPPN|MRLSDF|MRLSPDF|LGS|LGP|HOBN|HODF|HVO|HVOF
MRLSPN |No |No |No |No |No |Yes|No |No |No |No
MRLSPPN |No |No |No |No |No |No |No |No |No |No
MRLSDF |No |No |No |No |No |Yes|No |No |No |No
MRLSPDF |No |No |No |No |No |No |No |No |No |No
LGS |No |No |No |No |No |Yes|No |No |No |No
LGP |Yes |No |Yes |No |No |No |No |No |No |No
HOBN |No |No |No |No |Yes|Yes|No |No |No |No
HODF |No |No |No |No |Yes|Yes|No |No |No |No
HVO |Yes |Yes |Yes |Yes |Yes|Yes|Yes |Yes |No |No
HVOF |Yes |Yes |Yes |Yes |Yes|Yes|Yes |Yes |No |No
Listo por fila en las columnas.
Solución
¿Puede cambiar su formato de una matriz a una tabla de asociación como
Tabla Productos adicionales: SoldProductCode AdditionalProductCode
Entonces su mesa se vería como
SoldProdCode, Additional ProdCode
MRLSPN, LGP
MRLSDF, LGP
Ahora puede simplemente ejecutar una consulta para decir
SELECT AdditionalProductCode
FROM AdditionalProducts
WHERE SoldProductcode='MRLSPN'
Editar
Otro beneficio de este enfoque es que si ofrece descuentos especiales si compra MRLSPN, obtiene LGP con un 10% de descuento y si compra MRLSDF puede obtener 15 $ de descuento. Con este modelo, puede ampliar la tabla de asociación para incluir atributos adicionales. Esto puede o no aplicarse a su modelo.
Otros consejos
Es una tabla de enlaces de muchos a muchos:
Sold CanBeSold ---- --------- MRLSPN LGP MRLSDF LGP …
y una consulta:
SELECT CanBeSold
FROM matrix
WHERE Sold = @Product
Si no puede garantizar más de 32 columnas, puede implementar usando un int (32 bits) como un campo de bandera de bits. Pero una relación de muchos a muchos será más flexible.
Cree una tabla de mapeo de muchos a muchos, ProductCode2ProductCodeMapping
CREATE TABLE ProductCode2ProductCodeMapping
(
ProductCodeId int,
AllowedProductCodeId int
)
Con una clave primaria compuesta usando ambas columnas.
Luego inserte una fila para cada producto y producto relacionado.
Luego simplemente consulta como:
SELECT AllowedProductCodeId
FROM ProductCode2ProductCodeMapping
WHERE ProductCodeId = @myProductCodeId
Si no tiene Id. enteros para productos, puede agregarlos o utilizar el código de producto char en su lugar (prefiero el primero)