none
instrução sql RRS feed

  • Pergunta

  •  

     

    quero pegar os dados

     

     

    CLIENTE              MARCA

    1                          A

    1                          B

    2                          A

    3                          B

     

    e montar a consulta de forma que exiba como

     

    CLIENTE              MARCA A             MARCA B

    1                           S                             S

    2                           S                             N

    3                           N                             S

     

     

    peço a ajuda de vocês, obrigado.

    sexta-feira, 27 de junho de 2008 21:13

Respostas

  • Bom Dia,

     

    É realmente uma pena que você não tenha em mãos o 2005. O recurso de pivot citado pelo Roberto em conjunto com as CTEs seria muito bom para esse tipo de situação. Segue uma solução 2000 based.

     

    Code Snippet

    CREATE TABLE tblClientes (Cliente INT, Marca CHAR(1))

     

    INSERT INTO tblClientes VALUES (1,'A')

    INSERT INTO tblClientes VALUES (1,'B')

    INSERT INTO tblClientes VALUES (2,'A')

    INSERT INTO tblClientes VALUES (3,'B')

     

    SELECT DISTINCT Cliente,

    -- Marca A

    CASE WHEN

    (SELECT COUNT(*) FROM tblClientes AS TInt

    WHERE TOut.Cliente = TInt.Cliente AND TInt.Marca = 'A') > 0 THEN 'S'

    ELSE 'N' END AS [MARCA A],

     

    -- Marca B

    CASE WHEN

    (SELECT COUNT(*) FROM tblClientes AS TInt

    WHERE TOut.Cliente = TInt.Cliente AND TInt.Marca = 'B') > 0 THEN 'S'

    ELSE 'N' END AS [MARCA B]

    FROM

    tblClientes AS TOut

     

    DROP TABLE tblClientes

     

    [ ]s,

     

    Gustavo

    domingo, 29 de junho de 2008 14:40

Todas as Respostas

  • Boa Tarde,

     

    Só existem duas marcas ?

     

    Qual SQL Server você está utilizando ?

     

    [ ]s,

     

    Gustavo

     

    sexta-feira, 27 de junho de 2008 21:38
  • sql server 2000, sim são somente 2 produtos.

    sexta-feira, 27 de junho de 2008 21:41
  • Carlos, tente isso:

     

    Code Snippet

    SELECT CLIENTE,

    CASE WHEN MARCA = 'A' THEN 'S' ELSE 'N' END AS [MARCAR A],

    CASE WHEN MARCA = 'B' THEN 'S' ELSE 'N' END AS [MARCAR B]

    FROM Tabela

     

     

    [ ]s.

     

    sexta-feira, 27 de junho de 2008 21:47
  • Poxa, não vi que vc tinha mais de um registro com o mesmo código.
    Essa query que postei não irá atender a sua necessidade.

     

    [ ]s.

    sexta-feira, 27 de junho de 2008 21:53
  • sim, esse é um problema também, não faço nem idéia por onde começar eu já gente fazendo isso com boletim.

     

    colocando as matérias nas colunas e notas abaixo delas.

     

    sexta-feira, 27 de junho de 2008 21:54
  • Sim, vi depois que poderia ser as duas opções.

    Não sei como o Gustavo estava pensando em fazer, talvez seja possível usar o UNION, ou algo parecido, vou dar uma saidinha, mas assim que voltar tentarei postar uma solução.

     

     [ ]s.

     

    sexta-feira, 27 de junho de 2008 21:58
  • Carlos,

     

         Você pode utilizar PIVOT TABLE se você estiver utilizando o SQL Server 2005.

     

         Dê uma olhada neste outro post:

     

    http://forums.microsoft.com/msdn-br/ShowPost.aspx?PostID=1381625&SiteID=21

     

    sábado, 28 de junho de 2008 17:28
    Moderador
  • Bom Dia,

     

    É realmente uma pena que você não tenha em mãos o 2005. O recurso de pivot citado pelo Roberto em conjunto com as CTEs seria muito bom para esse tipo de situação. Segue uma solução 2000 based.

     

    Code Snippet

    CREATE TABLE tblClientes (Cliente INT, Marca CHAR(1))

     

    INSERT INTO tblClientes VALUES (1,'A')

    INSERT INTO tblClientes VALUES (1,'B')

    INSERT INTO tblClientes VALUES (2,'A')

    INSERT INTO tblClientes VALUES (3,'B')

     

    SELECT DISTINCT Cliente,

    -- Marca A

    CASE WHEN

    (SELECT COUNT(*) FROM tblClientes AS TInt

    WHERE TOut.Cliente = TInt.Cliente AND TInt.Marca = 'A') > 0 THEN 'S'

    ELSE 'N' END AS [MARCA A],

     

    -- Marca B

    CASE WHEN

    (SELECT COUNT(*) FROM tblClientes AS TInt

    WHERE TOut.Cliente = TInt.Cliente AND TInt.Marca = 'B') > 0 THEN 'S'

    ELSE 'N' END AS [MARCA B]

    FROM

    tblClientes AS TOut

     

    DROP TABLE tblClientes

     

    [ ]s,

     

    Gustavo

    domingo, 29 de junho de 2008 14:40
  •  

    show gustavo, atendeu as minhas necessidades.

     

    só quero tirar uma dúvida, existe como fazer isso sem eu usar o Count TInt.Marca = 'A', ou seja, estou informando os produtos que desejo para agrupar da maneira que pedi, isso porque são poucos produtos.

     

     

    E quando houver uma lista de 30 produtos, existe como eu fazer para trazer dessa forma sem a necessidade de informar qual o produto?

     

    abs

     

    Carlos

    domingo, 29 de junho de 2008 21:34
  • Olá Carlos,

     

    Infelizmente não. O SQL Server (no 2005 inclusive) só permite que você faça o Pivot se você conhecer previamente a lista das colunas. Se você necessitar de fazer uma consulta dessas sem passar a lista de produtos, você terá que usar uma SQL dinâmica. No 2005 isso ficou menos difícil, mas a SQL dinâmica ainda é necessária.

     

    Tente utilizar recursos de aplicação para fazer isso como a tabela dinâmica do Excel.

     

    Em breve (em algum momento do segundo semestre) farei uma apresentação sobre consultas não triviais usando o TSQL. Esse tipo de pivoteamento é uma das que pretendo abordar. Quando estiver pronta eu aviso aqui no fórum.

     

    [ ]s,

     

    Gustavo

    domingo, 29 de junho de 2008 22:05