Array
(
)

Como faco para puxar dados do mes anterior

Dzkbrasil
   - 27 ago 2007

Ola gostaria de saber como faco para puxar dados do mes anterior, caso digite o periodo de 01/02/2006 a 28/02/2006 ele me retorne as informacoes do mes atual e do mes janeiro.

segue a estrutura do sql..

SELECT
´-1´ AS PAGINA,
ISNULL(TABS.MES,0) AS MES,
CREDITO_ANTERIOR,
SUM(ISNULL(BASE_CALCULO,0)) AS BASE_CALCULO,
SUM(ISNULL(TOTAL_SAIDAS,0)) AS TOTAL_SAIDAS,
SUM(BASE_CREDITO) AS BASE_CREDITO

FROM (
SELECT
MES,
SUM(BASE_CALCULO) AS BASE_CALCULO,
SUM(TOTAL_SAIDAS) AS TOTAL_SAIDAS
FROM (
SELECT
--MONTH(S.DATA_EMISSAO)AS MES,
MONTH(S.DATA_REG)AS MES,
SITR.VALOR_BASE AS BASE_CALCULO,
SI.VALOR_ITEM_CONTABIL AS TOTAL_SAIDAS

FROM TBLIVROREGES S
INNER JOIN TBLIVROREGESITEM SI
ON S.CHAVE_FATO = SI.CHAVE_FATO AND
SI.NUM_SUBITEM = 0
INNER JOIN TBLIVROREGESITEMTRB SITR
ON SI.CHAVE_FATO = SITR.CHAVE_FATO AND
SI.NUM_ITEM = SITR.NUM_ITEM AND
SI.NUM_SUBITEM = SITR.NUM_SUBITEM AND
SITR.COD_IMPOSTO = ´ICMS´
INNER JOIN TBCFOP CFOP
ON CFOP.COD_CFOP = SI.COD_CFOP
INNER JOIN TBLOTEESCRITA LE
ON S.COD_FILIAL = LE.COD_FILIAL AND S.COD_LOTE = LE.COD_LOTE AND LE.TIPO_ES = ´S´

WHERE
S.DATA_REG BETWEEN ´1901-01-01´ AND ´1902-02-02´ AND
CFOP.TIPO_ORIGEM_DESTINO IN (´F´) AND S.STATUS <> ´C´) TABS
GROUP BY MES) TABS

FULL OUTER JOIN

(SELECT
MES,
SUM(BASE_CREDITO) AS BASE_CREDITO,
(SELECT
SUM(isnull(EITR.VALOR_IMPOSTO,0)) AS CREDITO_ANTERIOR --+isnull(EITR.VALOR_OUTRAS,0)) AS CREDITO_ANTERIOR

FROM TBLIVROREGES E
INNER JOIN TBLIVROREGESITEM EI
ON E.CHAVE_FATO = EI.CHAVE_FATO AND
EI.NUM_SUBITEM = 0
INNER JOIN TBLIVROREGESITEMTRB EITR
ON EI.CHAVE_FATO = EITR.CHAVE_FATO AND
EI.NUM_ITEM = EITR.NUM_ITEM AND
EI.NUM_SUBITEM = EITR.NUM_SUBITEM AND
EITR.COD_IMPOSTO = ´ICMS´

WHERE
E.DATA_REG < ´1901-01-01´ AND
EI.COD_CFOP IN (´PRM1´) AND E.STATUS <> ´C´
) AS CREDITO_ANTERIOR

FROM (
SELECT
MONTH(E.DATA_REG) AS MES,
isnull(EITR.VALOR_IMPOSTO,0) AS BASE_CREDITO --+isnull(EITR.VALOR_OUTRAS,0) AS BASE_CREDITO
FROM TBLIVROREGES E
INNER JOIN TBLIVROREGESITEM EI
ON E.CHAVE_FATO = EI.CHAVE_FATO AND
EI.NUM_SUBITEM = 0
INNER JOIN TBLIVROREGESITEMTRB EITR
ON EI.CHAVE_FATO = EITR.CHAVE_FATO AND
EI.NUM_ITEM = EITR.NUM_ITEM AND
EI.NUM_SUBITEM = EITR.NUM_SUBITEM AND
EITR.COD_IMPOSTO = ´ICMS´
INNER JOIN TBCFOP CFOP
ON CFOP.COD_CFOP = EI.COD_CFOP
WHERE
E.DATA_REG BETWEEN CAST(CAST(DATEPART(YEAR,´1901-01-01´) AS CHAR (4))+´-01-01´ AS DATETIME) AND ´1902-02-02´ AND
CFOP.Tipo_ES = ´E´ AND EI.COD_CFOP IN (´PRM1´) AND E.STATUS <> ´C´) TABE

GROUP BY MES) TABE

ON TABS.MES = TABE.MES

GROUP BY
TABS.MES,
TABE.CREDITO_ANTERIOR

order by TABS.MES

valewss

Emerson
   - 27 ago 2007

antes que qualquer coisa, vamos tentar simplificar aquela instrução.

teste com esta e veja se obtém o mesmo resultado e se há melhora na performance (não tenho como testar):
#Código

SELECT
  ´-1´ PAGINA,
  MONTH(LR.DATA_REG) MES,
  SUM(CASE WHEN CFOP.TIPO_ORIGEM_DESTINO IN (´F´)
                AND LE.TIPO_ES = ´S´ -- LE.?? não poderia ser LR. ou CFOP.???
           THEN LRIT.VALOR_BASE
           ELSE 0.0 END) BASE_CALCULO,
  SUM(CASE WHEN CFOP.TIPO_ORIGEM_DESTINO IN (´F´)
                AND LE.TIPO_ES = ´S´  -- LE.?? não poderia ser LR. ou CFOP.???
           THEN LRI.VALOR_ITEM_CONTABIL
           ELSE 0.0 END) TOTAL_SAIDAS,
  SUM(CASE WHEN EI.COD_CFOP IN (´PRM1´)
                AND CFOP.TIPO_ES = ´E´
           THEN LRIT.VALOR_IMPOSTO
           ELSE 0.0 END) BASE_CREDITO,
  (SELECT
     SUM(ISNULL(EITR.VALOR_IMPOSTO,0.0))
   FROM
     TBLIVROREGES E
   INNER JOIN TBLIVROREGESITEM EI
     ON EI.CHAVE_FATO = E.CHAVE_FATO AND
        EI.NUM_SUBITEM = 0
   INNER JOIN TBLIVROREGESITEMTRB EITR
     ON EITR.CHAVE_FATO = EI.CHAVE_FATO AND
        EITR.NUM_ITEM = EI.NUM_ITEM AND
        EITR.NUM_SUBITEM = EI.NUM_SUBITEM AND
        EITR.COD_IMPOSTO = ´ICMS´
   WHERE
     E.DATA_REG < ´1901-01-01´ AND E.TIPO_ES = ´E´ AND
     EI.COD_CFOP IN (´PRM1´) AND E.STATUS <> ´C´
   ) CREDITO_ANTERIOR
FROM
  TBLIVROREGES LR
INNER JOIN TBLIVROREGESITEM LRI
  ON LRI.CHAVE_FATO = LR.CHAVE_FATO AND LRI.NUM_SUBITEM = 0
INNER JOIN TBLIVROREGESITEMTRB LRIT
  ON LRIT.CHAVE_FATO = LRI.CHAVE_FATO AND
     LRIT.NUM_ITEM = LRI.NUM_ITEM AND
     LRIT.NUM_SUBITEM = LRI.NUM_SUBITEM AND
     LRIT.COD_IMPOSTO = ´ICMS´
INNER JOIN TBCFOP CFOP
  ON CFOP.COD_CFOP = LRI.COD_CFOP
LEFT JOIN TBLOTEESCRITA LE -- faz sentido utilizar esta tabela?
  ON LE.COD_FILIAL = LR.COD_FILIAL AND
     LE.COD_LOTE = LR.COD_LOTE AND LR.TIPO_ES = ´S´
WHERE
  LR.DATA_REG BETWEEN ´1901-01-01´ AND ´1902-02-02´ AND
  LR.STATUS <> ´C´
GROUP BY
  MONTH(LR.DATA_REG)