Ciclo ‘FOR’ en SQL

publicado por: Anonymous

Tengo un query en sql el cual las columnas de la tabla resultado son los meses de a̱o: Enero РDiciembre.

DECLARE @Ventas MONEY
declare @i int
declare @ano int
declare @mes int
set @ano = 2016
set @mes = 12
set @i = 1

WHILE @i <= @mes
    BEGIN
        set @Ventas = (SELECT SUM(LAB.CREDIT_AMOUNT - LAB.DEBIT_AMOUNT) BALANCE  
                       FROM LEDGER_ACCOUNT AS LAC, LEDGER_ACCOUNT_BALANCE AS LAB 
                       WHERE YEAR(LAB.POSTING_DATE)= @ano 
                       and MONTH(LAB.POSTING_DATE)= @i 
                       and  LAC.ACCOUNT_ID = LAB.ACCOUNT_ID 
                       AND  LAB.CURRENCY_ID = 'NIO'  
                       AND  (LAC.ACCOUNT_ID LIKE '43' + '%'))

        SELECT '43' CUENTA, 'Ventas' DESCRIPTION, @Ventas BALANCE , @Ventas/@Ventas PER
        set @i = @i + 1;
END;

Me arroja los doce meses, pero en tablas separadas, quiero que se unan en una sola fila:

introducir la descripción de la imagen aquí

Hice éste OTRO previamente me aparecen unidas en una sola fila, pero tuve problemas con la columna ‘PER’ (No la puedo montar):

            SELECT '43' CUENTA, 'Ventas' DESCRIP ,  
             SUM(CASE MONTH(LAB.POSTING_DATE) WHEN 1 THEN
             LAB.CREDIT_AMOUNT - LAB.DEBIT_AMOUNT ELSE 0 END) ENERO, 
              SUM(CASE MONTH(LAB.POSTING_DATE) WHEN 2 THEN
             LAB.CREDIT_AMOUNT - LAB.DEBIT_AMOUNT ELSE 0 END) FEBRERO  ,  
               SUM(CASE MONTH(LAB.POSTING_DATE) WHEN 3 THEN
             LAB.CREDIT_AMOUNT - LAB.DEBIT_AMOUNT ELSE 0 END) MARZO  ,  
               SUM(CASE MONTH(LAB.POSTING_DATE) WHEN 4 THEN
             LAB.CREDIT_AMOUNT - LAB.DEBIT_AMOUNT ELSE 0 END) ABRIL  ,  
               SUM(CASE MONTH(LAB.POSTING_DATE) WHEN 5 THEN
             LAB.CREDIT_AMOUNT - LAB.DEBIT_AMOUNT ELSE 0 END) MAYO  ,  
               SUM(CASE MONTH(LAB.POSTING_DATE) WHEN 6 THEN
             LAB.CREDIT_AMOUNT - LAB.DEBIT_AMOUNT ELSE 0 END) JUNIO  ,  
               SUM(CASE MONTH(LAB.POSTING_DATE) WHEN 7 THEN
             LAB.CREDIT_AMOUNT - LAB.DEBIT_AMOUNT ELSE 0 END) JULIO  ,  
               SUM(CASE MONTH(LAB.POSTING_DATE) WHEN 8 THEN
             LAB.CREDIT_AMOUNT - LAB.DEBIT_AMOUNT ELSE 0 END) AGOSTO  ,  
               SUM(CASE MONTH(LAB.POSTING_DATE) WHEN 9 THEN
             LAB.CREDIT_AMOUNT - LAB.DEBIT_AMOUNT ELSE 0 END) SEPTIEMBRE  ,  
               SUM(CASE MONTH(LAB.POSTING_DATE) WHEN 10 THEN
             LAB.CREDIT_AMOUNT - LAB.DEBIT_AMOUNT ELSE 0 END) OCTUBRE  ,  
               SUM(CASE MONTH(LAB.POSTING_DATE) WHEN 11 THEN
             LAB.CREDIT_AMOUNT - LAB.DEBIT_AMOUNT ELSE 0 END) NOVIEMBRE  ,  
               SUM(CASE MONTH(LAB.POSTING_DATE) WHEN 12 THEN
             LAB.CREDIT_AMOUNT - LAB.DEBIT_AMOUNT ELSE 0 END) DICIEMBRE  
             FROM LEDGER_ACCOUNT AS LAC, LEDGER_ACCOUNT_BALANCE AS LAB 
             WHERE  YEAR(LAB.POSTING_DATE)= @ano 
             and  LAC.ACCOUNT_ID = LAB.ACCOUNT_ID 
             AND  LAB.CURRENCY_ID = 'NIO'  
             AND  (LAC.ACCOUNT_ID LIKE '43' + '%')

Me sale algo como ésto, necesito la columna PER (Ventas/ Ventas) para cada mes del año y estamos al 100, ésto solo es un ejemplo, hay muchos más PER a calcular…Ventas/Ventas es solo un ejemplo anormal.

introducir la descripción de la imagen aquí

solución

Una manera sencilla, y que te permite hacerlo todo en una consulta, es usando una expresión de tabla común con el SQL que ya tienes:

;with CTE as (
      SELECT '43' CUENTA, 'Ventas' DESCRIP ,  
             SUM(CASE MONTH(LAB.POSTING_DATE) WHEN 1 THEN
             LAB.CREDIT_AMOUNT - LAB.DEBIT_AMOUNT ELSE 0 END) ENERO, 
              SUM(CASE MONTH(LAB.POSTING_DATE) WHEN 2 THEN
             LAB.CREDIT_AMOUNT - LAB.DEBIT_AMOUNT ELSE 0 END) FEBRERO  ,  
               SUM(CASE MONTH(LAB.POSTING_DATE) WHEN 3 THEN
             LAB.CREDIT_AMOUNT - LAB.DEBIT_AMOUNT ELSE 0 END) MARZO  ,  
               SUM(CASE MONTH(LAB.POSTING_DATE) WHEN 4 THEN
             LAB.CREDIT_AMOUNT - LAB.DEBIT_AMOUNT ELSE 0 END) ABRIL  ,  
               SUM(CASE MONTH(LAB.POSTING_DATE) WHEN 5 THEN
             LAB.CREDIT_AMOUNT - LAB.DEBIT_AMOUNT ELSE 0 END) MAYO  ,  
               SUM(CASE MONTH(LAB.POSTING_DATE) WHEN 6 THEN
             LAB.CREDIT_AMOUNT - LAB.DEBIT_AMOUNT ELSE 0 END) JUNIO  ,  
               SUM(CASE MONTH(LAB.POSTING_DATE) WHEN 7 THEN
             LAB.CREDIT_AMOUNT - LAB.DEBIT_AMOUNT ELSE 0 END) JULIO  ,  
               SUM(CASE MONTH(LAB.POSTING_DATE) WHEN 8 THEN
             LAB.CREDIT_AMOUNT - LAB.DEBIT_AMOUNT ELSE 0 END) AGOSTO  ,  
               SUM(CASE MONTH(LAB.POSTING_DATE) WHEN 9 THEN
             LAB.CREDIT_AMOUNT - LAB.DEBIT_AMOUNT ELSE 0 END) SEPTIEMBRE  ,  
               SUM(CASE MONTH(LAB.POSTING_DATE) WHEN 10 THEN
             LAB.CREDIT_AMOUNT - LAB.DEBIT_AMOUNT ELSE 0 END) OCTUBRE  ,  
               SUM(CASE MONTH(LAB.POSTING_DATE) WHEN 11 THEN
             LAB.CREDIT_AMOUNT - LAB.DEBIT_AMOUNT ELSE 0 END) NOVIEMBRE  ,  
               SUM(CASE MONTH(LAB.POSTING_DATE) WHEN 12 THEN
             LAB.CREDIT_AMOUNT - LAB.DEBIT_AMOUNT ELSE 0 END) DICIEMBRE  
             FROM LEDGER_ACCOUNT AS LAC, LEDGER_ACCOUNT_BALANCE AS LAB 
             WHERE  YEAR(LAB.POSTING_DATE)= @ano 
             and  LAC.ACCOUNT_ID = LAB.ACCOUNT_ID 
             AND  LAB.CURRENCY_ID = 'NIO'  
             AND  (LAC.ACCOUNT_ID LIKE '43' + '%')
)
select cuenta, descrip,
       enero, enero/enero as enero_per,
       febrero, febrero/febrero as febrero_per,
       ...
  from CTE
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *