none
Concatenar dos columnas que tienen un alias RRS feed

  • Pregunta

  • Hola 

    Estoy trabajando con SQL Server 2014 Express Edition tengo la necesidad de concatenar dos columnas que tienen un alias y mostrar el resultado de la consulta en el siguiente formato:

    Nombre de producto                 | Talla     | Color       | Precio Venta

    VESTIDO ISAURA SAMANTHA    |    S       | NEGRO    | 18.00

    VESTIDO ISAURA SAMANTHA    |    M       | NEGRO    | 18.00

    VESTIDO ISAURA SAMANTHA    |    L       | NEGRO    | 18.00

    VESTIDO ISAURA SAMANTHA    |    XL      | NEGRO    | 18.00

    Me gustaría concatenar las columnas: Nombre producto + Talla + Color, pero si se complica como muestro en este formato.

    Que no salgan los espacios vacíos como muestro en la imagen

    Query

    SELECT P.Nombre,  
    	ISNULL((CASE WHEN O.EspecificacionId = 5 THEN O.NombreOpcion END), '') AS TALLA,
    	ISNULL((CASE WHEN O.EspecificacionId = 2 THEN O.NombreOpcion END), '') AS COLOR,
    	PC.PrecioVenta
    FROM Productos AS P
    JOIN ProductoCatalogos AS PC ON P.ProductoId = PC.ProductoId
    JOIN EspecificacionCatalogos AS EC ON PC.ProductoCatalogoId = EC.ProductoCatalogoId
    JOIN Opciones AS O ON EC.OpcionId = O.OpcionId
    WHERE P.Nombre LIKE '%VESTiDO ISAURA%'  

    Olvidaba poner el diagrama:


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú


    • Editado Pedro Ávila sábado, 1 de diciembre de 2018 17:47
    sábado, 1 de diciembre de 2018 17:44

Respuestas

  • Pedro,

    Revisando bien el esquema, me parece que deberias revisar tu modelo y explico por que.

    Si corres cada query por separado, que logica usarias para unir ambos conjuntos?

    - CROSS JOIN

    - INNER JOIN por Nombre y PrecioVanta

    DECLARE @Productos table (
    ProductoId int,
    TipoProducto int,
    Codigo varchar(50),
    Nombre varchar(50),
    PrecioCompra money,
    Utilidad money,
    PrecioBase money,
    Estado int
    );
    
    INSERT INTO @Productos (
    	ProductoId,
        TipoProducto,
        Codigo,
        Nombre,
        PrecioCompra,
        Utilidad,
        PrecioBase,
        Estado
    )
    VALUES
    	(447, 1, '001', 'VESTIDO ISAURA SAMANTHA', 15.00, 20.00, 18.00, 1);
    
    DECLARE @ProductoCatalogos table (
    ProductoCatalogoId int,
    CatalogoId int,
    ProductoId int,
    Cantidad decimal(5, 2),
    UnidadMedidaId int,
    PrecioBase money,
    Descuento decimal(5, 2),
    PrecioVenta money,
    MonedaId int,
    IncluyeImpuesto int
    );
    
    INSERT INTO @ProductoCatalogos (
        ProductoCatalogoId,
        CatalogoId,
        ProductoId,
        Cantidad,
        UnidadMedidaId,
        PrecioBase,
        Descuento,
        PrecioVenta,
        MonedaId,
        IncluyeImpuesto
    )
    VALUES
    	(20, 1, 447, 2.00, 1, 18.00, 0.00, 18.00, 1, 2);
    
    DECLARE @EspecificacionCatalogos table (
    EspecificacionCatalogoId int,
    ProductoCatalogoId int,
    EspecificacionProductoId int,
    OpcionId int
    );
    
    INSERT INTO @EspecificacionCatalogos (
        EspecificacionCatalogoId,
        ProductoCatalogoId,
        EspecificacionProductoId,
        OpcionId
    )
    VALUES
    	(1346, 20, 24, 17),
    	(1347, 20, 25, 8),
    	(1348, 20, 24, 18),
    	(1349, 20, 25, 8),
    	(1350, 20, 24, 19),
    	(1351, 20, 25, 8),
    	(1352, 20, 24, 20),
    	(1353, 20, 25, 8);
    
    DECLARE @Opciones table (
    OpcionId int,
    EspecificacionId int,
    NombreOpcion varchar(50)
    );
    
    INSERT INTO @Opciones (
        OpcionId,
        EspecificacionId,
        NombreOpcion
    )
    VALUES
    	(1 , 1, '28'),
    	(2 , 1, '30'),
    	(3 , 1, '32'),
    	(4 , 1, '34'),
    	(5 , 1, '36'),
    	(6 , 2, 'ROJO'),
    	(7 , 2, 'AZUL'),
    	(8 , 2, 'NEGRO'),
    	(9 , 2, 'VERDE'),
    	(10, 3, 'P1'),
    	(11, 3, 'P2'),
    	(12, 3, 'P44'),
    	(13, 4, 'MANZANA'),
    	(14, 4, 'PERAS'),
    	(15, 4, 'MANGOS'),
    	(16, 4, 'SANDIA'),
    	(17, 5, 'S'),
    	(18, 5, 'M'),
    	(19, 5, 'L'),
    	(20, 5, 'XL'),
    	(21, 2, 'AMARILLO'),
    	(22, 2, 'BLANCO'),
    	(23, 2, 'PLOMO'),
    	(24, 6, 'PRUEBA1'),
    	(25, 6, 'PRUEBA2'),
    	(26, 6, 'PRUEBA4'),
    	(27, 1, '38'),
    	(28, 3, 'P5');
    
    SELECT
    	P.Nombre,  
    	O.NombreOpcion AS TALLA,
    	PC.PrecioVenta
    FROM 
    	@Productos AS P
    	JOIN 
    	@ProductoCatalogos AS PC 
    	ON P.ProductoId = PC.ProductoId
    	JOIN 
    	@EspecificacionCatalogos AS EC 
    	ON PC.ProductoCatalogoId = EC.ProductoCatalogoId
    	JOIN 
    	@Opciones AS O 
    	ON EC.OpcionId = O.OpcionId
    WHERE 
    	P.Nombre LIKE '%VESTiDO ISAURA%'
    	AND O.EspecificacionId = 5
    
    SELECT
    	P.Nombre,  
    	O.NombreOpcion AS COLOR,
    	PC.PrecioVenta
    FROM 
    	@Productos AS P
    	JOIN 
    	@ProductoCatalogos AS PC 
    	ON P.ProductoId = PC.ProductoId
    	JOIN 
    	@EspecificacionCatalogos AS EC 
    	ON PC.ProductoCatalogoId = EC.ProductoCatalogoId
    	JOIN 
    	@Opciones AS O 
    	ON EC.OpcionId = O.OpcionId
    WHERE 
    	P.Nombre LIKE '%VESTiDO ISAURA%'
    	AND O.EspecificacionId = 2;
    GO
    
    /*
    
    Nombre	TALLA	PrecioVenta
    VESTIDO ISAURA SAMANTHA	S	18.00
    VESTIDO ISAURA SAMANTHA	M	18.00
    VESTIDO ISAURA SAMANTHA	L	18.00
    VESTIDO ISAURA SAMANTHA	XL	18.00
    
    
    Nombre	COLOR	PrecioVenta
    VESTIDO ISAURA SAMANTHA	NEGRO	18.00
    VESTIDO ISAURA SAMANTHA	NEGRO	18.00
    VESTIDO ISAURA SAMANTHA	NEGRO	18.00
    VESTIDO ISAURA SAMANTHA	NEGRO	18.00
    
    */

    En otras palabras, que logica usarias para unir dos o mas especificaciones de un mismo producto-catalogo?

    Como ves, es dificil dar una sugerencia sin saber la respuesta a esta pregunta, aunque usando trucos se pudiera llegar a un resultado esperado pero sin seguridad de que esta solucion aplicaria a todo producto-catalogo.

    SELECT DISTINCT
    	CONCAT(T.Nombre, ' | ', T.TALLA, ' | ', C.COLOR) AS Prod_Talla_Color,
    	T.PrecioVenta
    FROM
    	(
    	SELECT
    		P.Nombre,  
    		O.NombreOpcion AS TALLA,
    		PC.PrecioVenta
    	FROM 
    		@Productos AS P
    		JOIN 
    		@ProductoCatalogos AS PC 
    		ON P.ProductoId = PC.ProductoId
    		JOIN 
    		@EspecificacionCatalogos AS EC 
    		ON PC.ProductoCatalogoId = EC.ProductoCatalogoId
    		JOIN 
    		@Opciones AS O 
    		ON EC.OpcionId = O.OpcionId
    	WHERE 
    		P.Nombre LIKE '%VESTiDO ISAURA%'
    		AND O.EspecificacionId = 5
    	) AS T
    	CROSS JOIN
    	(
    	SELECT
    		P.Nombre,  
    		O.NombreOpcion AS COLOR,
    		PC.PrecioVenta
    	FROM 
    		@Productos AS P
    		JOIN 
    		@ProductoCatalogos AS PC 
    		ON P.ProductoId = PC.ProductoId
    		JOIN 
    		@EspecificacionCatalogos AS EC 
    		ON PC.ProductoCatalogoId = EC.ProductoCatalogoId
    		JOIN 
    		@Opciones AS O 
    		ON EC.OpcionId = O.OpcionId
    	WHERE 
    		P.Nombre LIKE '%VESTiDO ISAURA%'
    		AND O.EspecificacionId = 2
    	) AS C
    ;
    
    /*
    
    Prod_Talla_Color	PrecioVenta
    VESTIDO ISAURA SAMANTHA | L | NEGRO	18.00
    VESTIDO ISAURA SAMANTHA | M | NEGRO	18.00
    VESTIDO ISAURA SAMANTHA | S | NEGRO	18.00
    VESTIDO ISAURA SAMANTHA | XL | NEGRO	18.00
    
    */


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    martes, 4 de diciembre de 2018 14:27

Todas las respuestas

  • Para concatenar los campos, simplemente tienes que prescindir del alias y usar el operador "+" para concatenar las expresiones. Después, si quieres, puedes poner un nuevo alias al resultado de la concatenación:

    Select P.Nombre + " " + ISNULL(......) + " " + ISNULL(.....) as Producto, PC.PrecioVenta
    FROM Productos as P
    JOIN etc etc

    sábado, 1 de diciembre de 2018 19:41
  • Hola Pedro Avila:

    Puedes hacer un self join o utilizar lead, para obtener el siguiente valor.

    Te pongo un ejemplo con cada. La extracción del conjunto de datos, la he metido en una variable de tabla por facilidad para realizar el mismo:

    DECLARE @productos TABLE
    (nombre      VARCHAR(100),
     talla       CHAR(2),
     color       VARCHAR(10),
     precioVenta DECIMAL(4, 2)
    );
    INSERT INTO @productos
    (nombre,
     talla,
     color,
     precioVenta
    )
    VALUES
    ('VESTIDO ISAURA SAMANTHA',
     'S',
     '',
     18.00
    ),
    ('VESTIDO ISAURA SAMANTHA',
     '',
     'NEGRO',
     18.00
    ),
    ('VESTIDO ISAURA SAMANTHA',
     'M',
     '',
     18.00
    ),
    ('VESTIDO ISAURA SAMANTHA',
     '',
     'NEGRO',
     18.00
    ),
    ('VESTIDO ISAURA SAMANTHA',
     'L',
     '',
     18.00
    ),
    ('VESTIDO ISAURA SAMANTHA',
     '',
     'NEGRO',
     18.00
    ),
    ('VESTIDO ISAURA SAMANTHA',
     'XL',
     '',
     18.00
    ),
    ('VESTIDO ISAURA SAMANTHA',
     '',
     'NEGRO',
     18.00
    );
    WITH cte
         AS (
         SELECT nombre,
                talla,
                color,
                precioventa,
                ROW_NUMBER() OVER(ORDER BY
    (
        SELECT NULL
    )) AS r
         FROM @productos)
         SELECT c.nombre+' | '+c.talla+' | '+d.color+' | '+CAST(c.precioVenta AS VARCHAR(10))
         FROM cte c
              LEFT JOIN cte d ON c.r = d.r - 1
         WHERE c.talla <> '';
    WITH cte
         AS (
         SELECT nombre,
                talla,
                color,
                precioventa,
                LEAD(color, 1, color) OVER(ORDER BY
    (
        SELECT NULL
    )) AS sig
         FROM @productos)
         SELECT c.nombre+' | '+c.talla+' | '+c.sig+' | '+CAST(c.precioVenta AS VARCHAR(10))
         FROM cte c
         WHERE c.talla <> '';
    
    

    Salida

    Lead

    https://docs.microsoft.com/es-es/sql/t-sql/functions/lead-transact-sql?view=sql-server-2017

    Self join

    https://es.khanacademy.org/computing/computer-programming/sql/relational-queries-in-sql/p/joining-tables-to-themselves-with-self-joins

    domingo, 2 de diciembre de 2018 7:27
  • Hola Alberto

    Si entiendo como concatenar lo que no puedo hacer es obtener el formato que publico en mi pregunta

    De igualmente gracias por responder.


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    lunes, 3 de diciembre de 2018 20:13
  • Hola Javi

    ¿Debo crear el cte?, ¿sobre quien aplico el lef join si es que no debo de crear el cte?

    No me ubico, como le envío los parámetros 5 y 2?

    Me puedes aclarar mis dudas por favor?

    Saludos!


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    lunes, 3 de diciembre de 2018 20:23
  • Si entiendo como concatenar lo que no puedo hacer es obtener el formato que publico en mi pregunta

    No entiendo. ¿Cuál es el formato que hay en tu pregunta? Lo único que se ve es que has puesto una rayita vertical entre los campos. Por supuesto, no hay problema en que esa rayita la metas entre las comillas en el mismo sitio donde yo te puse un espacio en blanco en mi respuesta. ¿O sino, qué otro requisito tiene que cumplir tu formato? No se ve claro en la pregunta.

    lunes, 3 de diciembre de 2018 20:27
  • Pedro,

    Creo que primero deberemos alinear Talla y Color con el nombre para luego concatenat.

    Si una entrada en el catalogo pudiera tener muchas opciones entonces primero necesitamos hacer un pivoteo de estas.

    SELECT
    	CONCAT(
    	MAX(P.Nombre),
    	' | ',
    	MAX(CASE WHEN O.EspecificacionId = 5 THEN O.NombreOpcion END),
    	' | ',
    	MAX(CASE WHEN O.EspecificacionId = 2 THEN O.NombreOpcion END)
    	) AS Prod_Talla_Color,
    	MAX(PC.PrecioVenta) AS PrecioVenta
    FROM
        Productos AS P
        JOIN
        ProductoCatalogos AS PC
        ON P.ProductoId = PC.ProductoId
        JOIN
        EspecificacionCatalogos AS EC
        ON PC.ProductoCatalogoId = EC.ProductoCatalogoId
        JOIN
        Opciones AS O
        ON EC.OpcionId = O.OpcionId
    WHERE
        P.Nombre LIKE '%VESTiDO ISAURA%'
    GROUP BY
    	P.ProductoId,
    	PC.ProductoCatalogoId;

    Si el resultado no es el esperado, entonces postea data de ejemplo para poder simular tu ambiente.


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    lunes, 3 de diciembre de 2018 20:33
  • Hola Alberto

    Con lo que me recomiendas el resultado sale de la siguiente manera

    Yo necesito lo siguiente:

    VESTIDO ISAURA SAMANTHA    S       NEGRO    18.00

    VESTIDO ISAURA SAMANTHA     M     NEGRO    18.00

    VESTIDO ISAURA SAMANTHA     L       NEGRO    18.00

    VESTIDO ISAURA SAMANTHA    XL      NEGRO   18.00

    El nombre del producto concatenado con la talla concatenado con el color pero en una sola fila, en la imagen del resultado esta separado en dos filas un solo producto.


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    lunes, 3 de diciembre de 2018 20:34
  • Hola Hunchback

    Me da error de sintaxis 

    En esta linea


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    lunes, 3 de diciembre de 2018 20:42
  • Copia la nueva version y si todavia da error tambien postea el mensaje de error.

    El error debe ser por la ultima coma dentro de la funcion CONCAT (quita esa coma).


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas


    lunes, 3 de diciembre de 2018 20:45
  • Corregí de esta manera pero me sale solo una talla


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    lunes, 3 de diciembre de 2018 20:46
  • Copia la ultima version que agrupa por ProductoId y ProductoCatalogoId.

    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    lunes, 3 de diciembre de 2018 20:47
  • Hola Hunchback

    Sigue saliendo una sola row

    Acá tengo data Server: den1.mssql4.gear.host user: negocio pass: Ga33-47L1YC!

    Tengo estos tres productos



    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú



    lunes, 3 de diciembre de 2018 20:55
  • Pedro, sin data de ejemplo no creo que pueda hacer mucho.

    Tirando una piedra, cambia la agrupacion por (P.ProductoId, PC.CatalogoId).

    Fijate que mi problema esta en entender todas las relaciones entre tablas ya que has optado por usar claves subrrogadas y por ende no puedo seguir la linea de relaciones.


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas


    lunes, 3 de diciembre de 2018 21:04
  • Hunchback

    Te pase una base de datos que esta en la nube, te pase server, user, pass puedes probar con pantalon 


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    lunes, 3 de diciembre de 2018 21:06
  • Pedro,

    Gracias por el intento pero no tengo acceso a esa nube.  Ve si puedes poner data de ejemplo para ese producto en especifico.

    - Productos

    - ProductoCatalogos

    - EspecificacionCatalogos

    - Opciones


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    lunes, 3 de diciembre de 2018 21:15
  • Hola Hunchback

    En este link https://1drv.ms/u/s!ArSzlnjk6KJwh58i3DJQ6tMz47nnzA

    Hay un script con la data que me solicitas.

    Productos

    ProductoId  TipoProducto Codigo        Nombre                     PrecioCompra     Utilidad   PrecioBase        Estado

    447           1                       VESTIDO ISAURA SAMANTHA       15.00           20.00      18.00             1

    ProductoCatalogos

    ProductoCatalogoId CatalogoId  ProductoId  Cantidad                                UnidadMedidaId PrecioBase                              Descuento                               PrecioVenta                             MonedaId    IncluyeImpuesto

    20                 1           447         2.00                                    1              18.00                                   0.00                                    18.00                                   1           2

    EspecificacionCatalogo

    EspecificacionCatalogoId ProductoCatalogoId EspecificacionProductoId OpcionId
    ------------------------ ------------------ ------------------------ -----------
    1346                     20                 24                       17
    1347                     20                 25                       8
    1348                     20                 24                       18
    1349                     20                 25                       8
    1350                     20                 24                       19
    1351                     20                 25                       8
    1352                     20                 24                       20
    1353                     20                 25                       8

    Opciones

    OpcionId    EspecificacionId NombreOpcion
    ----------- ---------------- --------------------------------------------------------------------------------
    1           1                28
    2           1                30
    3           1                32
    4           1                34
    5           1                36
    6           2                ROJO
    7           2                AZUL
    8           2                NEGRO
    9           2                VERDE
    10          3                P1
    11          3                P2
    12          3                P44
    13          4                MANZANA
    14          4                PERAS
    15          4                MANGOS
    16          4                SANDIA
    17          5                S
    18          5                M
    19          5                L
    20          5                XL
    21          2                AMARILLO
    22          2                BLANCO
    23          2                PLOMO
    24          6                PRUEBA1
    25          6                PRUEBA2
    26          6                PRUEBA4
    27          1                38
    28          3                P5



    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú


    lunes, 3 de diciembre de 2018 21:28
  • Hola Pedro Avila:

    Esta era la solución que te proponía.

    ;WITH cte
         AS (
         SELECT nombre,
                isnull((case when o.EspecificacionId =5 then O.NombreOpcion End),'')as Talla,
                Isnull((case when o.EspecificacionId =2 then O.NombreOpcion End),'') as Color,
                precioventa,
                LEAD(isnull((case when o.EspecificacionId =2 then O.NombreOpcion End),'') ,
    			 1, isnull((case when o.EspecificacionId =2 then O.NombreOpcion End),'') )
    			 OVER(ORDER BY(    SELECT NULL ))) AS sig
         FROM 
    		Productos as P
    		join ProductoCatalogo as Pc on p.ProductoId  =Pc.ProductoId
    		join ExpecificacionCatalogos as ec on pc.ProductoCatalogoId = Ec.ProductoCatalogoId
    		join Opciones as o on ec.OpcionId= O.OpcionId
    		Where P.Nombre LIKE '%VESTIDO ISAURA%'
    	 )
         SELECT c.nombre+' | '+c.talla+' | '+c.sig+' | '+CAST(c.precioVenta AS VARCHAR(10))
         FROM cte c
         WHERE c.talla <> '';


    martes, 4 de diciembre de 2018 1:04
  • Javi,

    Sin un orden a prioris "OVER(ORDER BY(    SELECT NULL ))" no seria determinista hablar de LEAD / LAG.  Por cada corrida pudieras obtener un resultado diferente.


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas


    martes, 4 de diciembre de 2018 14:16
  • Pedro,

    Revisando bien el esquema, me parece que deberias revisar tu modelo y explico por que.

    Si corres cada query por separado, que logica usarias para unir ambos conjuntos?

    - CROSS JOIN

    - INNER JOIN por Nombre y PrecioVanta

    DECLARE @Productos table (
    ProductoId int,
    TipoProducto int,
    Codigo varchar(50),
    Nombre varchar(50),
    PrecioCompra money,
    Utilidad money,
    PrecioBase money,
    Estado int
    );
    
    INSERT INTO @Productos (
    	ProductoId,
        TipoProducto,
        Codigo,
        Nombre,
        PrecioCompra,
        Utilidad,
        PrecioBase,
        Estado
    )
    VALUES
    	(447, 1, '001', 'VESTIDO ISAURA SAMANTHA', 15.00, 20.00, 18.00, 1);
    
    DECLARE @ProductoCatalogos table (
    ProductoCatalogoId int,
    CatalogoId int,
    ProductoId int,
    Cantidad decimal(5, 2),
    UnidadMedidaId int,
    PrecioBase money,
    Descuento decimal(5, 2),
    PrecioVenta money,
    MonedaId int,
    IncluyeImpuesto int
    );
    
    INSERT INTO @ProductoCatalogos (
        ProductoCatalogoId,
        CatalogoId,
        ProductoId,
        Cantidad,
        UnidadMedidaId,
        PrecioBase,
        Descuento,
        PrecioVenta,
        MonedaId,
        IncluyeImpuesto
    )
    VALUES
    	(20, 1, 447, 2.00, 1, 18.00, 0.00, 18.00, 1, 2);
    
    DECLARE @EspecificacionCatalogos table (
    EspecificacionCatalogoId int,
    ProductoCatalogoId int,
    EspecificacionProductoId int,
    OpcionId int
    );
    
    INSERT INTO @EspecificacionCatalogos (
        EspecificacionCatalogoId,
        ProductoCatalogoId,
        EspecificacionProductoId,
        OpcionId
    )
    VALUES
    	(1346, 20, 24, 17),
    	(1347, 20, 25, 8),
    	(1348, 20, 24, 18),
    	(1349, 20, 25, 8),
    	(1350, 20, 24, 19),
    	(1351, 20, 25, 8),
    	(1352, 20, 24, 20),
    	(1353, 20, 25, 8);
    
    DECLARE @Opciones table (
    OpcionId int,
    EspecificacionId int,
    NombreOpcion varchar(50)
    );
    
    INSERT INTO @Opciones (
        OpcionId,
        EspecificacionId,
        NombreOpcion
    )
    VALUES
    	(1 , 1, '28'),
    	(2 , 1, '30'),
    	(3 , 1, '32'),
    	(4 , 1, '34'),
    	(5 , 1, '36'),
    	(6 , 2, 'ROJO'),
    	(7 , 2, 'AZUL'),
    	(8 , 2, 'NEGRO'),
    	(9 , 2, 'VERDE'),
    	(10, 3, 'P1'),
    	(11, 3, 'P2'),
    	(12, 3, 'P44'),
    	(13, 4, 'MANZANA'),
    	(14, 4, 'PERAS'),
    	(15, 4, 'MANGOS'),
    	(16, 4, 'SANDIA'),
    	(17, 5, 'S'),
    	(18, 5, 'M'),
    	(19, 5, 'L'),
    	(20, 5, 'XL'),
    	(21, 2, 'AMARILLO'),
    	(22, 2, 'BLANCO'),
    	(23, 2, 'PLOMO'),
    	(24, 6, 'PRUEBA1'),
    	(25, 6, 'PRUEBA2'),
    	(26, 6, 'PRUEBA4'),
    	(27, 1, '38'),
    	(28, 3, 'P5');
    
    SELECT
    	P.Nombre,  
    	O.NombreOpcion AS TALLA,
    	PC.PrecioVenta
    FROM 
    	@Productos AS P
    	JOIN 
    	@ProductoCatalogos AS PC 
    	ON P.ProductoId = PC.ProductoId
    	JOIN 
    	@EspecificacionCatalogos AS EC 
    	ON PC.ProductoCatalogoId = EC.ProductoCatalogoId
    	JOIN 
    	@Opciones AS O 
    	ON EC.OpcionId = O.OpcionId
    WHERE 
    	P.Nombre LIKE '%VESTiDO ISAURA%'
    	AND O.EspecificacionId = 5
    
    SELECT
    	P.Nombre,  
    	O.NombreOpcion AS COLOR,
    	PC.PrecioVenta
    FROM 
    	@Productos AS P
    	JOIN 
    	@ProductoCatalogos AS PC 
    	ON P.ProductoId = PC.ProductoId
    	JOIN 
    	@EspecificacionCatalogos AS EC 
    	ON PC.ProductoCatalogoId = EC.ProductoCatalogoId
    	JOIN 
    	@Opciones AS O 
    	ON EC.OpcionId = O.OpcionId
    WHERE 
    	P.Nombre LIKE '%VESTiDO ISAURA%'
    	AND O.EspecificacionId = 2;
    GO
    
    /*
    
    Nombre	TALLA	PrecioVenta
    VESTIDO ISAURA SAMANTHA	S	18.00
    VESTIDO ISAURA SAMANTHA	M	18.00
    VESTIDO ISAURA SAMANTHA	L	18.00
    VESTIDO ISAURA SAMANTHA	XL	18.00
    
    
    Nombre	COLOR	PrecioVenta
    VESTIDO ISAURA SAMANTHA	NEGRO	18.00
    VESTIDO ISAURA SAMANTHA	NEGRO	18.00
    VESTIDO ISAURA SAMANTHA	NEGRO	18.00
    VESTIDO ISAURA SAMANTHA	NEGRO	18.00
    
    */

    En otras palabras, que logica usarias para unir dos o mas especificaciones de un mismo producto-catalogo?

    Como ves, es dificil dar una sugerencia sin saber la respuesta a esta pregunta, aunque usando trucos se pudiera llegar a un resultado esperado pero sin seguridad de que esta solucion aplicaria a todo producto-catalogo.

    SELECT DISTINCT
    	CONCAT(T.Nombre, ' | ', T.TALLA, ' | ', C.COLOR) AS Prod_Talla_Color,
    	T.PrecioVenta
    FROM
    	(
    	SELECT
    		P.Nombre,  
    		O.NombreOpcion AS TALLA,
    		PC.PrecioVenta
    	FROM 
    		@Productos AS P
    		JOIN 
    		@ProductoCatalogos AS PC 
    		ON P.ProductoId = PC.ProductoId
    		JOIN 
    		@EspecificacionCatalogos AS EC 
    		ON PC.ProductoCatalogoId = EC.ProductoCatalogoId
    		JOIN 
    		@Opciones AS O 
    		ON EC.OpcionId = O.OpcionId
    	WHERE 
    		P.Nombre LIKE '%VESTiDO ISAURA%'
    		AND O.EspecificacionId = 5
    	) AS T
    	CROSS JOIN
    	(
    	SELECT
    		P.Nombre,  
    		O.NombreOpcion AS COLOR,
    		PC.PrecioVenta
    	FROM 
    		@Productos AS P
    		JOIN 
    		@ProductoCatalogos AS PC 
    		ON P.ProductoId = PC.ProductoId
    		JOIN 
    		@EspecificacionCatalogos AS EC 
    		ON PC.ProductoCatalogoId = EC.ProductoCatalogoId
    		JOIN 
    		@Opciones AS O 
    		ON EC.OpcionId = O.OpcionId
    	WHERE 
    		P.Nombre LIKE '%VESTiDO ISAURA%'
    		AND O.EspecificacionId = 2
    	) AS C
    ;
    
    /*
    
    Prod_Talla_Color	PrecioVenta
    VESTIDO ISAURA SAMANTHA | L | NEGRO	18.00
    VESTIDO ISAURA SAMANTHA | M | NEGRO	18.00
    VESTIDO ISAURA SAMANTHA | S | NEGRO	18.00
    VESTIDO ISAURA SAMANTHA | XL | NEGRO	18.00
    
    */


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    martes, 4 de diciembre de 2018 14:27
  • Gracias por la apreciación. ;)

    martes, 4 de diciembre de 2018 17:01
  • Hola Hunchback

    que logica usarias para unir dos o mas especificaciones de un mismo producto-catalogo?

    Para obtener las especificaciones de un producto hago la siguiente consulta.

    Pregunto si el producto tiene especificaciones.

    public IEnumerable<UniversalExtend> ListaEspecificaciones(string valor)
            {
                using (var context = new BusinessContext())
                {
                    var list = from ep in context.EspecificacionProductos
                        join e in context.Especificaciones on ep.EspecificacionId equals e.EspecificacionId
                        join p in context.Productos on ep.ProductoId equals p.ProductoId
                        where p.Nombre.Contains(valor)
                        orderby e.Nombre ascending 
                        select new UniversalExtend()
                        {
                            Id = ep.EspecificacionId,
                            Nombre = e.Nombre
                        };
                    return list.ToList();
                }
            } 

    Si tiene especificaciones se lo paso a otra consulta como parámetros 

    public IEnumerable<UniversalExtend> SearchProduct(int[] paraInts, string valor)
            {
                int colorId = paraInts[0];
                int tallaId = paraInts[1];
                using (var context = new BusinessContext())
                {
                    var result = context.Database.SqlQuery<UniversalExtend>("SELECT distinct(PC.ProductoCatalogoId) AS Id, PC.ProductoId," +
                                                                            " P.Nombre + ' ' + PL.Product + ' ' + E.Nombre + ' ' + O.NombreOpcion AS Descripcion, PC.PrecioVenta," +
                                                                            " C.Nombre AS Nombre" +
                                                                            " FROM ProductoCatalogos AS PC" +
                                                                            " INNER JOIN Catalogos AS C ON PC.CatalogoId = C.CatalogoId" +
                                                                            " INNER JOIN Productos AS P ON PC.ProductoId = P.ProductoId" +
                                                                            " INNER JOIN EspecificacionCatalogos AS EC ON PC.ProductoCatalogoId = EC.ProductoCatalogoId" +
                                                                            " INNER JOIN EspecificacionProductos AS EP ON EC.EspecificacionProductoId = EP.EspecificacionProductoId" +
                                                                            " INNER JOIN Especificaciones AS E ON EP.EspecificacionId = E.EspecificacionId" +
                                                                            " AND E.EspecificacionId = @colorId" +
                                                                            " INNER JOIN Opciones AS O ON EC.OpcionId = O.OpcionId" +
                                                                            " CROSS APPLY(" +
                                                                            " SELECT E.Nombre + ' ' + O.NombreOpcion AS 'Product'" +
                                                                            " FROM ProductoCatalogos AS PC" +
                                                                            " INNER JOIN Productos AS P ON PC.ProductoId = P.ProductoId" +
                                                                            " INNER JOIN EspecificacionCatalogos AS EC ON PC.ProductoCatalogoId = EC.ProductoCatalogoId" +
                                                                            " INNER JOIN EspecificacionProductos AS EP ON EC.EspecificacionProductoId = EP.EspecificacionProductoId" +
                                                                            " INNER JOIN Especificaciones AS E ON EP.EspecificacionId = E.EspecificacionId" +
                                                                            " AND E.EspecificacionId = @tallaId" +
                                                                            " INNER JOIN Opciones AS O ON EC.OpcionId = O.OpcionId" +
                                                                            " ) PL" +
                                                                            " WHERE P.Nombre LIKE '%' + @valor + '%'",
                        new SqlParameter("@colorId", colorId), new SqlParameter("@tallaId", tallaId),
                        new SqlParameter("@valor", valor)).ToList();
                    return result;
                }
            }

    Esta consulta no es definitiva porque también se que el diseño no me parece correcto como que algo se me escapo en el diseño y no se como corregirlo les agradecería me puedan ayudar.

    Si no tiene parametros llamo a otra consulta.

    public IEnumerable<UniversalExtend> SearchProduct(string valor)
            {
                using (var context = new BusinessContext())
                {
                    var result = from pc in context.ProductoCatalogos
                        join c in context.Catalogos on pc.CatalogoId equals c.CatalogoId
                        join p in context.Productos on pc.ProductoId equals p.ProductoId
                        where p.Nombre.Contains(valor)
                        select new UniversalExtend()
                        {
                            Id = pc.ProductoCatalogoId,
                            ProductoId = pc.ProductoId,
                            Descripcion = p.Nombre,
                            PrecioVenta = pc.PrecioVenta,
                            Nombre = c.Nombre
                        };
                    return result.ToList();
                }
            }

    Es lo que se me ocurrio, pero en la tabla opciones tengo las tallas y colores según yo he creado un maestro de especificaciones que puedo vender casí cualquier producto hasta un servicio.

    Esquema db

    Arriba de ProductoCatalogo esta Catalogo están relacionados, cuando vendo busco los productos en Producto Catalogo si un producto no esta en Producto Catalogo no puedo venderlo, solo vendo los productos que están en un catalogo, hay producto que tienen especificaciones como hay productos que no lo tienen, o vender un servicio.

    Si necesitas mas información con gusto te lo daré

    Nota: El modelo esta abierto para hacer correcciones(solo deseo poder vender casi cualquier producto hasta un servicio).

    Saludos.


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    miércoles, 5 de diciembre de 2018 14:59
  • Hola a todos

    ¿Alguna propuesta para modificar mi modelo?, según la respuesta que le dí.

    @Hunchback

    Como ves, es dificil dar una sugerencia sin saber la respuesta a esta pregunta, aunque usando trucos se pudiera llegar a un resultado esperado pero sin seguridad de que esta solucion aplicaria a todo producto-catalogo.

    Ayudenme a corregir mi modelo.

    Saludos!


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú



    lunes, 10 de diciembre de 2018 14:35
  • Hola

    Cuando agregue las EspecificacionesCatalogos a CatalogoProducto se puede agregar los dos id de Opciones a EspecificaciónCatalogo. Entonces tendría el id de la Opción y el id de la Especificación, con eso ya se pueden facilitar las cosas, ¿que opinan?

     Agregando lo comentado lineas arriba.

    Espero sus comentarios.

    Saludos!


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    lunes, 10 de diciembre de 2018 16:01
  • Señores

    Hice el cambio que me sugirieron y el que les indique que hice y funciona muy bien, esta es la nueva consulta.

    SELECT DISTINCT
    	CONCAT(T.Nombre, ' | ', T.TALLA, ' | ', C.COLOR) AS PRODUCTO, T.PrecioVenta
    	FROM
    	(
    		SELECT P.Nombre, O.NombreOpcion AS TALLA, PC.PrecioVenta
    		FROM Productos AS P
    		JOIN ProductoCatalogos AS PC ON P.ProductoId = PC.ProductoId
    		JOIN EspecificacionCatalogos AS EC ON PC.ProductoCatalogoId = EC.ProductoCatalogoId
    		JOIN Opciones AS O ON EC.OpcionId = O.OpcionId
    		JOIN Especificaciones AS E ON EC.EspecificacionId = E.EspecificacionId
    		WHERE P.Nombre LIKE '%VESTIDO ISAURA%' AND EC.EspecificacionId = 5
    	) AS T
    	CROSS JOIN
    	(
    		SELECT P.Nombre, O.NombreOpcion AS COLOR, PC.PrecioVenta
    		FROM Productos AS P
    		JOIN ProductoCatalogos AS PC ON P.ProductoId = PC.ProductoId
    		JOIN EspecificacionCatalogos AS EC ON PC.ProductoCatalogoId = EC.ProductoCatalogoId
    		JOIN Opciones AS O ON EC.OpcionId = O.OpcionId
    		JOIN Especificaciones AS E ON EC.EspecificacionId = E.EspecificacionId
    		WHERE P.Nombre LIKE '%VESTIDO ISAURA%' AND EC.EspecificacionId = 2
    	) AS C

    Falta ordenar de forma ascendente la talla para que salga S, M, L, XL

    Espero lo puedan revisar y decirme sus comentarios.

    NOTA: Gracias a @Hunchback, @Javi Fernández y @Alberto Población

    Saludos


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú



    lunes, 10 de diciembre de 2018 21:10
  • Hola

    Otro detalle que veo es que pasa si solo tengo un producto que tiene una sola especificación o tiene tres o n especificaciones esa consulta ya no me serviría.

    Saludos!


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú

    miércoles, 12 de diciembre de 2018 13:36