none
Resultado de um LEFT JOIN RRS feed

  • Pergunta

  • Pessoal,

    Imaginem este select:

    	
    IF OBJECT_ID('tempdb..#DIA') IS NOT NULL DROP TABLE #DIA
    IF OBJECT_ID('tempdb..#PROD') IS NOT NULL DROP TABLE #PROD
    	
    ---
    	
    SELECT 1 as dia, '2013-07-01' as data  INTO #DIA UNION
    SELECT 2 as dia, '2013-07-02' as data UNION
    SELECT 3 as dia, '2013-07-03' as data UNION
    SELECT 4 as dia, '2013-07-04' as data UNION
    SELECT 5 as dia, '2013-07-05' as data 
    
    -- SELECT * FROM #DIA
    
    ---
    
    SELECT 1 as dia, 'XPTO' as prod, 2 as qtd INTO #PROD UNION
    SELECT 2 as dia, 'XPTO' as prod, 5 as qtd UNION
    SELECT 2 as dia, 'BLA' as prod, 9 as qtd UNION
    SELECT 5 as dia, 'XPTO' as prod, 4 as qtd 
    
    -- SELECT * FROM #PROD
    
    ---
    
    SELECT 
    	 d.dia
    	,d.data
    	,p.*
    FROM #DIA d	
    LEFT JOIN #PROD p
    	ON (d.dia = p.dia)

    Com este resultado:


    É possível fazer alguma maneira que o retorno fique assim?

    Obrigada!


    "Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta."

    Érica Tohoma | http://bloggirlsa.wordpress.com

    quarta-feira, 3 de julho de 2013 13:42

Respostas

  • Bom dia,

    Érica, experimente fazer um teste com o script abaixo:

    IF OBJECT_ID('tempdb..#DIA') IS NOT NULL DROP TABLE #DIA
    IF OBJECT_ID('tempdb..#PROD') IS NOT NULL DROP TABLE #PROD
    
    SELECT 1 as dia, '2013-07-01' as data  INTO #DIA UNION
    SELECT 2 as dia, '2013-07-02' as data UNION
    SELECT 3 as dia, '2013-07-03' as data UNION
    SELECT 4 as dia, '2013-07-04' as data UNION
    SELECT 5 as dia, '2013-07-05' as data 
    
    -- SELECT * FROM #DIA
    
    ---
    
    SELECT 1 as dia, 'XPTO' as prod, 2 as qtd INTO #PROD UNION
    SELECT 2 as dia, 'XPTO' as prod, 5 as qtd UNION
    SELECT 2 as dia, 'BLA' as prod, 9 as qtd UNION
    SELECT 5 as dia, 'XPTO' as prod, 4 as qtd 
    
    -- SELECT * FROM #PROD
    
    ---
    
    ;with CTE_P as
    (
        select distinct prod from #PROD
    )
    
    SELECT 
    	 d.dia
    	,d.data
    	,c.prod
    	,p.qtd
    FROM #DIA d	
    CROSS JOIN CTE_P as c
    LEFT JOIN #PROD p
        ON 
            p.dia = d.dia and
            p.prod = c.prod 
    order by c.prod, d.data
    

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta éricat quarta-feira, 3 de julho de 2013 15:08
    quarta-feira, 3 de julho de 2013 14:59

Todas as Respostas

  • Erica, bom dia !

    No campo dia voce poderia utilizar um isnull() pegando o datepart do dia do campo data, para a quantidade a mesma coisa um isnull() para zero, agora qual seria a logica para preencher o campo prod quando este for nulo ? se for baseado em dia uma que ja tem este produto um dia poderia ter mais de um produto ?

    Quando a ordenação voce poderia colocar um order by prod, data.


    Alexandre Matayosi Conde Mauricio.

    quarta-feira, 3 de julho de 2013 14:05
  • Oi Matayosi,

    minha duvida mesmo são essas linhas em "vermelho" na imagem do excel que publiquei

    e sim, 1 dia pode ter N produtos

    a logica seria mais para o SSRS, que eu queria mostrar todas as datas, independente se o produto tenha sido vendido ou nao naquela data


    "Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta."

    Érica Tohoma | http://bloggirlsa.wordpress.com

    quarta-feira, 3 de julho de 2013 14:30
  • Bom dia,

    Érica, experimente fazer um teste com o script abaixo:

    IF OBJECT_ID('tempdb..#DIA') IS NOT NULL DROP TABLE #DIA
    IF OBJECT_ID('tempdb..#PROD') IS NOT NULL DROP TABLE #PROD
    
    SELECT 1 as dia, '2013-07-01' as data  INTO #DIA UNION
    SELECT 2 as dia, '2013-07-02' as data UNION
    SELECT 3 as dia, '2013-07-03' as data UNION
    SELECT 4 as dia, '2013-07-04' as data UNION
    SELECT 5 as dia, '2013-07-05' as data 
    
    -- SELECT * FROM #DIA
    
    ---
    
    SELECT 1 as dia, 'XPTO' as prod, 2 as qtd INTO #PROD UNION
    SELECT 2 as dia, 'XPTO' as prod, 5 as qtd UNION
    SELECT 2 as dia, 'BLA' as prod, 9 as qtd UNION
    SELECT 5 as dia, 'XPTO' as prod, 4 as qtd 
    
    -- SELECT * FROM #PROD
    
    ---
    
    ;with CTE_P as
    (
        select distinct prod from #PROD
    )
    
    SELECT 
    	 d.dia
    	,d.data
    	,c.prod
    	,p.qtd
    FROM #DIA d	
    CROSS JOIN CTE_P as c
    LEFT JOIN #PROD p
        ON 
            p.dia = d.dia and
            p.prod = c.prod 
    order by c.prod, d.data
    

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta éricat quarta-feira, 3 de julho de 2013 15:08
    quarta-feira, 3 de julho de 2013 14:59
  • Perfeito!

    Era isso o que eu precisava

    obrigada


    "Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta."

    Érica Tohoma | http://bloggirlsa.wordpress.com

    quarta-feira, 3 de julho de 2013 15:08