none
Select numa tabela para apresentar dados em colunas RRS feed

  • Pergunta

  • tenho uma tabela com a seguinte estrutura:

    CODPROD           MES  ANO   QTD

    KINCFI4GB            1    2014   20.00000
    KINCFI4GB            2    2014   50.00000
    KINCFI4GB            3    2013   200.00000
    KINCFI4GB            4    2013   105.00000
    KINCFI4GB            5    2014   16.00000
    KINCFI4GB            6    2014   27.00000
    KINCFI4GB            7    2014   10.00000
    KINCOOIKHXFAN    1   2011   6.00000
    KINCOOIKHXFAN    2   2011   4.00000
    KINCOOIKHXFAN    3   2010   24.00000

    PRECISO DE UM SQL QUE EU POSSA MOSTRAR, para cada produto :

    CODPRO          QTD MES1    QTD MES2  QTD MES3

    KINCFI4GB        20.00000   50.00000    200.00000

    Agradeço a ajuda

    quinta-feira, 3 de julho de 2014 18:52

Respostas

  • Deleted
    • Marcado como Resposta Newton Costa-BA quinta-feira, 3 de julho de 2014 20:14
    quinta-feira, 3 de julho de 2014 19:57
  • pEDRO,

    Obrigado pela resposta.

    Na verdade quero apresentar as quantidades para até 03 meses de um determinado ano, cujo ano e mês incial serão informado via parâmetro.

    Consegui selecionar por ano na minha queyr, porem com mês da erro.

    ;With Vendas AS
     (
     SELECT [ano], [it-codigo],
             [1] as [QTD MES1], [2] as [QTD MES2], [3] AS [QTD MES3]

       FROM (SELECT [ano], [IT-CODIGO], MES, QTD
              FROM [vendaking])  as S
                   pivot (max(QTD) for MES in ([1],[2], [3])) as P
            
     )
    SELECT
      item.[desc-item]
      ,item.[codigo-refer]
      ,[saldo-dia].[it-codigo]
      ,[saldo-dia].[dt-saldo]
      ,[saldo-dia].[qt-saldo]
      ,[saldo-dia].[qt-tra]
      ,[vendas].[qtd mes1]
      ,[vendas].[qtd mes2]
      ,[vendas].[qtd mes3]

    FROM
      [saldo-dia]
      INNER JOIN item
        ON [saldo-dia].[it-codigo] = item.[it-codigo]
      INNER JOIN vendas
        ON [saldo-dia].[it-codigo] = [vendas].[it-codigo]

    • Marcado como Resposta Newton Costa-BA sexta-feira, 4 de julho de 2014 15:15
    sexta-feira, 4 de julho de 2014 15:10

Todas as Respostas

  • Deleted
    • Marcado como Resposta Newton Costa-BA quinta-feira, 3 de julho de 2014 20:14
    quinta-feira, 3 de julho de 2014 19:57
  • José Diz,

    Perfeito, funciona corretamente.

    Na verdade os valores são mês as mês dentro do mesmo ano.

    Caso mude de ano, a seleção será feita pela mês/ano.

    vou tentar incluir no meu código pois é um relatório com diversas informações, estas colunas ( 3 meses) são apenas para o faturamento.

    Grato

    quinta-feira, 3 de julho de 2014 20:14
  •  
    Newton, isso é uma aplicação típica do operador pivot.

    Mas no exemplo que postou os dados são de no mínimo cinco anos (2010 a 2014). Os dados de um mesmo mês para um mesmo produto devem ser somados, caso existam informações em mais de um ano? Por exemplo, se para o produto X houver dados de 1/2014 e 1/2013, é para somar os dois meses?

    Eis sugestão inicial, que soma linhas de mesmo mês para mesmo produto.

    -- código 1
    SELECT CODPROD, 
           [1] as [QTD MES1], [2] as [QTD MES2], 
           ...
           [11] as [QTD MES11], [12] as [QTD MES12]
      from (SELECT CODPROD, MES, QTD 
              from tabela) as S
           pivot (sum(QTD) for MES in ([1],[2],...,[11],[12])) as P;

    Obrigado, funciona perfeitamente.


        José Diz     Belo Horizonte, MG - Brasil




    quinta-feira, 3 de julho de 2014 20:14
  • Newton,

    Você quer transformar os valores que estão sendo apresentados em linha no formato de coluna?

    Veja este exemplo:

    CODPROD           MES  ANO   QTD
    
    KINCFI4GB            1    2014   20.00000
     KINCFI4GB            2    2014   50.00000
     KINCFI4GB            3    2013   200.00000
     KINCFI4GB            4    2013   105.00000
     KINCFI4GB            5    2014   16.00000
     KINCFI4GB            6    2014   27.00000
     KINCFI4GB            7    2014   10.00000
     KINCOOIKHXFAN    1   2011   6.00000
     KINCOOIKHXFAN    2   2011   4.00000
     KINCOOIKHXFAN    3   2010   24.00000
    
    
    
     Create Table Valores
      (CodProd Varchar(20),
       Mes TinyInt,
       Ano SmallInt,
       QTD Float)
    
    
    Insert Into Valores 
    Values('KINCFI4GB',1,2014,20.00000),
     ('KINCFI4GB',2,2014,50.00000),
     ('KINCFI4GB',3,2013,200.00000),
     ('KINCFI4GB',4,2013,105.00000),
     ('KINCFI4GB',5,2014,16.00000),
     ('KINCFI4GB',6,2014,27.00000),
     ('KINCFI4GB',7,2014,10.00000),
     ('KINCOOIKHXFAN',1,2011,6.00000),
     ('KINCOOIKHXFAN',2,2011,4.00000),
     ('KINCOOIKHXFAN',3,2010,24.00000)
    
     Select * from Valores
    
    Select CodProd, [1],[2],[3],[4],[5],[6] from Valores
    Pivot (sum(qtd) for mes in ([1],[2],[3],[4],[5],[6])) p
    


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    quinta-feira, 3 de julho de 2014 20:16
  • pEDRO,

    Obrigado pela resposta.

    Na verdade quero apresentar as quantidades para até 03 meses de um determinado ano, cujo ano e mês incial serão informado via parâmetro.

    Consegui selecionar por ano na minha queyr, porem com mês da erro.

    ;With Vendas AS
     (
     SELECT [ano], [it-codigo],
             [1] as [QTD MES1], [2] as [QTD MES2], [3] AS [QTD MES3]

       FROM (SELECT [ano], [IT-CODIGO], MES, QTD
              FROM [vendaking])  as S
                   pivot (max(QTD) for MES in ([1],[2], [3])) as P
            
     )
    SELECT
      item.[desc-item]
      ,item.[codigo-refer]
      ,[saldo-dia].[it-codigo]
      ,[saldo-dia].[dt-saldo]
      ,[saldo-dia].[qt-saldo]
      ,[saldo-dia].[qt-tra]
      ,[vendas].[qtd mes1]
      ,[vendas].[qtd mes2]
      ,[vendas].[qtd mes3]

    FROM
      [saldo-dia]
      INNER JOIN item
        ON [saldo-dia].[it-codigo] = item.[it-codigo]
      INNER JOIN vendas
        ON [saldo-dia].[it-codigo] = [vendas].[it-codigo]

    • Marcado como Resposta Newton Costa-BA sexta-feira, 4 de julho de 2014 15:15
    sexta-feira, 4 de julho de 2014 15:10