none
Calcular colunas dinamicamente. RRS feed

  • Pergunta

  • Boa tarde,

    Preciso criar varias colunas de diferença, mas para isso preciso calcular uma coluna - a proxima coluna, até o final da tabela.

    Ex:

    Colunas : 201401 201402 201403

    valores:   10,00    15,00   20,00

    Tenho que pegar a coluna 201401 e subtrair a coluna 201402 e criar um coluna de diferença, após vou pegar a coluna 201402 - 201403 e também criar o campo de diferença, isso até o final da tabela, ficando como no exemplo abaixo:

    Colunas 201401 Dif 201402 dif  201403

    valores:   10,00    5   15,00  5  20,00

    Espero que eu tenha consegui explicar.

    Agradeço a ajuda desde ja.

    segunda-feira, 23 de fevereiro de 2015 18:00

Respostas

Todas as Respostas

  • PriMadeira

    Qual a versão de seu SQL e estas colunas são dinamicas ou fixas? ex. termina no 201403


    Att.
    Marcelo Fernandes
    MCP, MCDBA, MCSA, MCTS, MCITP, MCT e MVP.
    Se Útil, classifique!!!
    Me siga no twitter: @marcelodba

    segunda-feira, 23 de fevereiro de 2015 20:58
    Moderador
  • Você tem a opção de criar uma coluna computada ou simplesmente criar uma trigger 

    Clique aqui  para detalhes da coluna computada e Clique Aqui para detalhes de trigger INSTEAD OF

    todas as duas seriam uma solução.

    terça-feira, 24 de fevereiro de 2015 12:06
  • Deleted
    terça-feira, 24 de fevereiro de 2015 12:21
  • Boa tarde pessoal,

    Resolvi com a seguinte query:

    --Cria coluna dinamica para o pivot
    declare @cols nvarchar(max)
    set @cols = stuff((
     select distinct ','   
      + quotename(vigencia) 
     from DASH.Emitido 
     for xml path('') 
     ), 1,1, '')
    ;

     -- prepara a consulta
     declare @query1 as nvarchar(max)
     set @query1='SELECT * into ##teste FROM
     (  SELECT
     CNOMB,
     SISTEMA,
     VIGENCIA,
     PREMIO
        FROM DASH.Emitido)
     AS t PIVOT (sum(PREMIO) FOR VIGENCIA IN ( ' + @cols + ' ) ) as P
     order by cnomb ;';
    execute (@query1)

     --monta a query automatica
     DECLARE @MES3 DATE, @MES4 DATE, @QUERY_FIM AS VARCHAR(MAX), @MES5 DATE, @MES6 DATE, @QUERY VARCHAR(MAX)
     ------------------------------------------------------------------
     SET @MES5 = DATEADD(MONTH,-3,@FINAL)
     SET @MES6 =  @FINAL
     ------------------------------------------------------------------
     SET @MES3 = DATEADD(MONTH,-3,@FINAL)
     SET @MES4 = DATEADD(MONTH,+1,@MES3)
      ------------------------------------------------------------------
     DECLARE @COUNT_2 INT = DATEDIFF(MONTH,@MES5,@MES6)+1
     ------------------------------------------------------------------
     SET @QUERY_FIM = 'INSERT INTO DASH.Resumo_Emitido ([CNOMB]
          ,[SISTEMA]
          ,[MES_01]
          ,[DIF_ENTRE_01_02]
          ,[MES_02]
          ,[DIF_ENTRE_02_03]
          ,[MES_03]
          ,[DIF_ENTRE_03_04]
          ,[MES_04]
          ,[DIF_ENTRE_04_05]) SELECT CNOMB,SISTEMA '
     ------------------------------------------------------------------
        WHILE @COUNT_2 > 0
       BEGIN
       SET @QUERY = ',ISNULL(ROUND([' + CONVERT(CHAR(6),@MES3,112) + '],2),0) AS MES_'+RIGHT(CONVERT(CHAR(6),@MES3,112),2)+',ROUND(ISNULL((CASE WHEN ([' +  CONVERT(CHAR(6),@MES4,112) + '] - [' + CONVERT(CHAR(6),@MES3,112) + '])=0 THEN NULL ELSE ([' +  CONVERT(CHAR(6),@MES4,112) + '] - [' + CONVERT(CHAR(6),@MES3,112) + ']) END /CASE WHEN [' + CONVERT(CHAR(6),@MES3,112) + ']=0 THEN NULL ELSE[' +  CONVERT(CHAR(6),@MES3,112) + ']END )*100,0),0) AS DIF_MES_'+RIGHT(CONVERT(CHAR(6),@MES3,112),2)+' ';
       SET @MES3= @MES4
       SET @MES4= DATEADD(MONTH,+1,@MES4)
       SET @COUNT_2 = @COUNT_2-1
       SET @QUERY_FIM += @QUERY
     END
    SET @QUERY_FIM += 'FROM ##TESTE '

    EXECUTE (@QUERY_FIM)

    segunda-feira, 16 de março de 2015 17:27