none
Particionar consulta SQL RRS feed

  • Pergunta

  • Olá pessoal, 

    Tenho uma consulta que divide os resultados em duas partes iguais quando a carteira dos títulos da base é "DIVIDIR".

    Preciso alterar para que quando for esta carteira especifica o resultado seja 70% dos títulos para a carteira A e 30% para a carteira B.

    Hoje minha consulta realiza o seguinte:

    SELECT
    	C.COD_CLIENTE
    	,CASE
    		WHEN C.CARTEIRA = 'DIVIDIR' 
    		THEN
    			CASE 
    				WHEN ROW_NUMBER() OVER(ORDER BY C.AGING, C.COD_UF, C.SALDO DESC) % 2 = 0 
    				THEN 'RENAC' 
    				ELSE 'INTERVALOR' 
    			END 
    		ELSE C.CARTEIRA
    	END CARTEIRA
    FROM 'TABELA DE TITULOS E CARTEIRA'


    Tentei utilizar o PARTITION BY e dividindo em 10 e pegando 7 partes para o primeiro resultado, porém os dois sem sucesso.

    Alguém já sofreu com isso?

    Att,

    André


    • Editado André Lorena quarta-feira, 10 de julho de 2019 15:00 Ajustar SQL
    quarta-feira, 10 de julho de 2019 13:29

Respostas

Todas as Respostas

  • Deleted
    quarta-feira, 10 de julho de 2019 13:54
  • José, 

    Estou usando o SQL Server 2016.

    Sobre as chaves da tabela, aí fica o problema, porque é uma view.

    SELECT 
    	a.COD_CLIENTE
    	,c.COD_UF
    	,MAX(
    		CASE
    			WHEN DATEDIFF(DAY,b.DT_VENCIMENTO,CONVERT(DATE,GETDATE())) >= 0  AND DATEDIFF(DAY,b.DT_VENCIMENTO,CONVERT(DATE,GETDATE())) <= 30  THEN 1
    			WHEN DATEDIFF(DAY,b.DT_VENCIMENTO,CONVERT(DATE,GETDATE())) > 30  AND DATEDIFF(DAY,b.DT_VENCIMENTO,CONVERT(DATE,GETDATE())) <= 60  THEN 2	    	
    			WHEN DATEDIFF(DAY,b.DT_VENCIMENTO,CONVERT(DATE,GETDATE())) > 60  AND DATEDIFF(DAY,b.DT_VENCIMENTO,CONVERT(DATE,GETDATE())) <= 90  THEN 3
    			WHEN DATEDIFF(DAY,b.DT_VENCIMENTO,CONVERT(DATE,GETDATE())) > 90  AND DATEDIFF(DAY,b.DT_VENCIMENTO,CONVERT(DATE,GETDATE())) <= 120 THEN 4
    			WHEN DATEDIFF(DAY,b.DT_VENCIMENTO,CONVERT(DATE,GETDATE())) > 120 AND DATEDIFF(DAY,b.DT_VENCIMENTO,CONVERT(DATE,GETDATE())) <= 150 THEN 5
    			WHEN DATEDIFF(DAY,b.DT_VENCIMENTO,CONVERT(DATE,GETDATE())) > 150 AND DATEDIFF(DAY,b.DT_VENCIMENTO,CONVERT(DATE,GETDATE())) <= 180 THEN 6
    			WHEN DATEDIFF(DAY,b.DT_VENCIMENTO,CONVERT(DATE,GETDATE())) > 180 AND DATEDIFF(DAY,b.DT_VENCIMENTO,CONVERT(DATE,GETDATE())) <= 210 THEN 7
    			WHEN DATEDIFF(DAY,b.DT_VENCIMENTO,CONVERT(DATE,GETDATE())) > 210 AND DATEDIFF(DAY,b.DT_VENCIMENTO,CONVERT(DATE,GETDATE())) <= 240 THEN 8
    			WHEN DATEDIFF(DAY,b.DT_VENCIMENTO,CONVERT(DATE,GETDATE())) > 240 AND DATEDIFF(DAY,b.DT_VENCIMENTO,CONVERT(DATE,GETDATE())) <= 270 THEN 9
    			WHEN DATEDIFF(DAY,b.DT_VENCIMENTO,CONVERT(DATE,GETDATE())) > 270 AND DATEDIFF(DAY,b.DT_VENCIMENTO,CONVERT(DATE,GETDATE())) <= 300 THEN 10
    			WHEN DATEDIFF(DAY,b.DT_VENCIMENTO,CONVERT(DATE,GETDATE())) > 300 AND DATEDIFF(DAY,b.DT_VENCIMENTO,CONVERT(DATE,GETDATE())) <= 330 THEN 11
    			WHEN DATEDIFF(DAY,b.DT_VENCIMENTO,CONVERT(DATE,GETDATE())) > 330 AND DATEDIFF(DAY,b.DT_VENCIMENTO,CONVERT(DATE,GETDATE())) <= 360 THEN 12
    			WHEN DATEDIFF(DAY,b.DT_VENCIMENTO,CONVERT(DATE,GETDATE())) > 360 THEN 13
    		END
    	) AGING
    	,(SELECT SUM(e.SALDO) FROM LX_Duplicatas e WITH(NOLOCK) WHERE a.COD_CLIENTE = e.COD_CLIENTE AND e.TIPO_REGISTRO = 'RI' AND e.SALDO <> 0 AND e.COD_SEQUENCIA = 0 AND e.TIPO IN ('DP','DS','DC') AND e.PORTADOR IN ('353','356','376','666','888','DEJ','GLO','GOL','SPD','REN','INT'))/(SELECT COUNT(1) FROM LX_Duplicatas e WITH(NOLOCK) WHERE a.COD_CLIENTE = e.COD_CLIENTE AND e.TIPO_REGISTRO = 'RI' AND e.SALDO <> 0 AND e.COD_SEQUENCIA = 0 AND e.TIPO IN ('DP','DS','DC') AND e.PORTADOR IN ('353','356','376','666','888','DEJ','GLO','GOL','SPD','REN','INT')) SALDO
    	,CASE				
    		WHEN (COUNT(CASE WHEN b.STATUS IN (15,16) THEN 1 END)) > 0
    		THEN 'RENAC'
    		WHEN (COUNT(CASE WHEN b.STATUS IN (17,18) THEN 1 END)) > 0
    		THEN 'INTERVALOR'
    		WHEN (COUNT(CASE WHEN b.STATUS IN (29,28) THEN 1 END)) > 0
    		THEN 'FERRARI'
    		WHEN (COUNT(CASE WHEN b.STATUS IN (19,20) THEN 1 END)) > 0
    		THEN 'SPEED'
    		WHEN (COUNT(CASE WHEN b.STATUS = 27 THEN 1 END)) > 0
    		THEN 'SPEED'
    		WHEN (COUNT(CASE WHEN d.CANAL_DE_VENDAS IN ('AMANN','DIGITAL') AND b.STATUS NOT IN (15,17) THEN 1 END)) > 0
    		THEN 'SPEED' 
    		WHEN (COUNT(CASE WHEN b.TIPO = 'DC' THEN 1 END)) > 0
    		THEN 'SPEED'
    		WHEN (COUNT(CASE WHEN b.STATUS NOT IN (15,17) THEN 1 END) ) > 0 AND (SELECT SUM(e.SALDO) FROM LX_Duplicatas e WITH(NOLOCK) WHERE a.COD_CLIENTE = e.COD_CLIENTE AND e.TIPO_REGISTRO = 'RI' AND e.SALDO <> 0 AND e.COD_SEQUENCIA = 0 AND e.TIPO IN ('DP','DS','DC') AND e.PORTADOR IN ('353','356','376','666','888','DEJ','GLO','GOL','SPD','REN','INT')) > 30000
    		THEN 'SPEED'
    		WHEN (COUNT(CASE WHEN b.STATUS = 21 THEN 1 END)) > 0 
    		THEN 'RENAC'
    		WHEN (COUNT(CASE WHEN b.STATUS = 22 THEN 1 END)) > 0
    		THEN 'INTERVALOR'
    		WHEN (COUNT(CASE WHEN DATEDIFF(DAY,b.DT_VENCIMENTO,CONVERT(DATE,GETDATE())) BETWEEN 180 AND 210 THEN 1 END)) > 0 
    		THEN 'DIVIDIR'
    		--WHEN (COUNT(CASE WHEN DATEDIFF(DAY,b.DT_VENCIMENTO,CONVERT(DATE,GETDATE())) > 210 THEN 1 END)) > 0 
    		--THEN 'SPEED'
            ELSE 'SPEED'
    	END CARTEIRA
    FROM
    	LX_Duplicatas a WITH(NOLOCK) 
    	LEFT JOIN LX_Duplicatas b WITH(NOLOCK) ON (a.COD_CLIENTE = b.COD_CLIENTE AND b.TIPO_REGISTRO = 'RI' AND b.SALDO <> 0 AND b.COD_SEQUENCIA = 0 AND b.TIPO IN ('DP','DS','DC') AND b.PORTADOR IN ('353','356','376','666','888','DEJ','GLO','GOL','SPD','REN','INT'))
    	LEFT JOIN ISO_Cliente c WITH(NOLOCK) ON (a.COD_CLIENTE = c.COD_CLIENTE_LX)
    	LEFT JOIN PEDIDOS_Canal d WITH(NOLOCK) ON (a.ORDEM = d.ORDEM)
    WHERE 
    	a.TIPO_REGISTRO = 'RI'
    	AND a.SALDO <> 0
    	AND a.COD_SEQUENCIA = 0
    	AND a.TIPO IN ('DP','DS','DC')
    	AND a.PORTADOR IN ('353','356','376','666','888','DEJ','GLO','GOL','SPD','REN','INT')
    	AND c.COD_CLASSIFICACAO NOT IN (98,90,19)
    	AND (d.CANAL_DE_VENDAS NOT IN ('LICITACAO','FORNECEDOR') OR d.CANAL_DE_VENDAS IS NULL)
    GROUP BY
    	a.COD_CLIENTE
    	,c.COD_UF

    Esse é o sql de criação da minha view.

    quarta-feira, 10 de julho de 2019 14:58
  • Deleted
    • Marcado como Resposta André Lorena quarta-feira, 10 de julho de 2019 17:59
    quarta-feira, 10 de julho de 2019 15:39
  • Funcionou desta forma José!!

    Obrigado pela ajuda.

    quarta-feira, 10 de julho de 2019 18:00