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.

¿Fue útil?

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)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top