none
Where valor_de_la_row='Si' RRS feed

  • Pregunta

  • Hola a todos!

    Tengo un problemita relacionado con un select.

    Tengo una tabla de bebidas, que se compone de la siguiente forma:

    id, PK

    idcliente FK

    cerveza varchar(2)

    vodka varchar(2)

    vino varchar(2)

    etc...

    Son 12 bebidas, y el varchar 2 corresponde a: Si y No

    Necesito realizar un select where idcliente=@idcliente (y bebidas='Si')¿?

    No se como poder mostrar solo las columnas con el valor Si.

    Desde ya agradezco cualquier ayuda que me puedan brindar.

    Saludos

    miércoles, 7 de junio de 2017 13:51

Respuestas

  • Se me ocurre transponer las columnas a filas -aquellas cuyo valor sea SI- y la resultante transponer a columnas, por ejemplo:

    CREATE TABLE #Bebidas (
        id int, idcliente int, cerveza varchar(2), vodka varchar(2), vino varchar(2)
    );
    INSERT INTO #Bebidas VALUES (1, 1, 'SI', 'NO', 'SI')
    
    DECLARE @idcliente int = 1;
    
    SELECT id, idcliente, bebida, value
    INTO #Temp
    FROM
        (SELECT b.id, b.idcliente, cerveza, vodka, vino 
        FROM #Bebidas b WHERE b.idcliente = @idcliente) p
        UNPIVOT 
    	   (value FOR bebida IN (cerveza, vodka, vino)) AS upvt
        WHERE value = 'SI'
    
    DECLARE @Columns nvarchar(max);
    DECLARE @Sql nvarchar(max);
    SET @Columns = STUFF((
        SELECT 
    	    ',' + QUOTENAME(bebida) FROM #Temp FOR XML PATH('')), 1, 1, '');
    
    SET @Sql = N'SELECT P.* FROM (
    	   SELECT id, idcliente, bebida, value FROM #Temp) AS R 
    	   PIVOT (MAX(value) FOR R.bebida IN (' + @Columns + N')) AS P';
    
    EXECUTE sp_executesql @Sql;
    
    DROP TABLE #Temp;
    DROP TABLE #Bebidas;
    GO

    - Resultado


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Propuesto como respuesta Brayan De La Cruz miércoles, 7 de junio de 2017 14:50
    • Marcado como respuesta Alesx de Souza miércoles, 7 de junio de 2017 15:20
    miércoles, 7 de junio de 2017 14:49

Todas las respuestas

  • Hola, creo entender que quieres saber si cualquiera de los campos cerveza,vino, vodka tienen el valor "Si" y mostrar las filas que tienen un Sí

    Para ello, nada mas sencillo que usar el operador OR.

    Select * from mitabla where idcliente=@idcliente  and (cerveza='Si' OR vodka='Si' OR vino='Si')

    Si lo que necesitas es otra cosa, no dudes en consultar, y si es posible nos pongas un ejemplo...

    Saludos


    JM Claudio Dba/Consultor SQL/BI Pasiona - Spain

    miércoles, 7 de junio de 2017 14:06
  • Gracias por la respuesta. 

    En efecto, eso lo sé. 

    Me preguntaba si podía ocultar aquellas columnas con valor 'No', y solo mostrar las columnas con 'Si'.

    En todo caso lo realizaré mediante programación desde la aplicación.

    Muchas gracias

    miércoles, 7 de junio de 2017 14:22
  • No es lo que necesitaba pero gracias.

    La columna bebidas no existe en la tabla. Se me ocurre agrupar las columnas en una condición, pero no se si esto es posible.

    miércoles, 7 de junio de 2017 14:32
  • Hola puedes usar un CASE en el SELECT, algo así.

    Select  Id, idcliente,CASE WHEN cerveza='Si' OR vodka='Si' OR vino='Si' THEN 'Si'  ELSE 'No'  END as Bebida

    FROM mitabla


    JM Claudio Dba/Consultor SQL/BI Pasiona - Spain

    miércoles, 7 de junio de 2017 14:43
  • Se me ocurre transponer las columnas a filas -aquellas cuyo valor sea SI- y la resultante transponer a columnas, por ejemplo:

    CREATE TABLE #Bebidas (
        id int, idcliente int, cerveza varchar(2), vodka varchar(2), vino varchar(2)
    );
    INSERT INTO #Bebidas VALUES (1, 1, 'SI', 'NO', 'SI')
    
    DECLARE @idcliente int = 1;
    
    SELECT id, idcliente, bebida, value
    INTO #Temp
    FROM
        (SELECT b.id, b.idcliente, cerveza, vodka, vino 
        FROM #Bebidas b WHERE b.idcliente = @idcliente) p
        UNPIVOT 
    	   (value FOR bebida IN (cerveza, vodka, vino)) AS upvt
        WHERE value = 'SI'
    
    DECLARE @Columns nvarchar(max);
    DECLARE @Sql nvarchar(max);
    SET @Columns = STUFF((
        SELECT 
    	    ',' + QUOTENAME(bebida) FROM #Temp FOR XML PATH('')), 1, 1, '');
    
    SET @Sql = N'SELECT P.* FROM (
    	   SELECT id, idcliente, bebida, value FROM #Temp) AS R 
    	   PIVOT (MAX(value) FOR R.bebida IN (' + @Columns + N')) AS P';
    
    EXECUTE sp_executesql @Sql;
    
    DROP TABLE #Temp;
    DROP TABLE #Bebidas;
    GO

    - Resultado


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Propuesto como respuesta Brayan De La Cruz miércoles, 7 de junio de 2017 14:50
    • Marcado como respuesta Alesx de Souza miércoles, 7 de junio de 2017 15:20
    miércoles, 7 de junio de 2017 14:49
  • Como siempre, Willams Morales genio total!

    Muchas gracias!!!

    miércoles, 7 de junio de 2017 15:21