开发者

MYSQL - Trouble with left join

I'm looking for a bug in a Java swing (it isn't my code) that dynamically generates a query. Sorry for the big query, but I've to report it here:

select  
b.CodiceCommercialeRiferimento as "Comm. Rif.",
b.PartitaIVA as "PartitaIVA",
b.FlgBusteCartotecnica as "Tipo Prodotto",
b.ClasseMerceologica as "Cl.Merc.",
Periodo0.V as Periodo0,
Periodo3.V as Periodo3,
Periodo4.V as Periodo4  
from (          
    select distinct                                          
        if (CodiceCommRif is null, '', DescrizioneCommRif) as CodiceCommercialeRiferimento,
        CommercialeRiferimento,
        trim(concat(bolle.CodiceCliente, ' - ', AnagraficaClientiPI.RagioneSociale1)) as CodiceClientePI,
        trim(concat(AnagraficaClientiPI.PartitaIVA, ' - ', AnagraficaClientiPI.RagioneSociale1)) as PartitaIVA,
        bolle.FlgBusteCartotecnica,
        if(DescrizioneCLM is null, '', DescrizioneCLM) as ClasseMerceologica        
    from bolle                                                              
    left join CodiciCommercialiRiferimento on CodiceCommRif = CommercialeRiferimento        
    inner join AnagraficaClienti as anagraficaclientiPI on bolle.codicecliente = anagraficaclientiPI.codicecliente          
    left join classemerceologica on bolle.ClasseMerceologica = classemerceologica.CodiceCLM  
    where  
        CommercialeRiferimento in ('001')  
        and  AnagraficaClientiPI.PartitaIVA  in ('0569XXXX000')  
        and  bolle.FlgBusteCartotecnica in ('B','C')  
        and  bolle.ClasseMerceologica  like '%%'         
) as b  left join  (                        
    select distinct                                          
        if (CodiceCommRif is null, '', DescrizioneCommRif) as CodiceCommercialeRiferimento, 
        CommercialeRiferimento,
        trim(concat(bolle.CodiceCliente, ' - ', AnagraficaClientiPI.RagioneSociale1)) as CodiceClientePI,
        trim(concat(AnagraficaClientiPI.PartitaIVA, ' - ', AnagraficaClientiPI.RagioneSociale1)) as PartitaIVA,
        bolle.FlgBusteCartotecnica,if(DescrizioneCLM is null, '', DescrizioneCLM) as ClasseMerceologica,              
        sum(if (TipoDocumento = 'N', -ValoreConsegnato, ValoreConsegnato)) as V              
        from bolle              
        inner join bollevalori on bolle.recordid = bollevalori.recordid         
        left join CodiciCommercialiRiferimento on CodiceCommRif = CommercialeRiferimento        
        inner join AnagraficaClienti as anagraficaclientiPI on bolle.codicecliente = anagraficaclientiPI.codicecliente          
        left join classemerceologica on bolle.ClasseMerceologica = classemerceologica.CodiceCLM  
        where  
            CommercialeRiferimento in ('001')  
            and  AnagraficaClientiPI.PartitaIVA  in ('0569XXXX000')  
            and  bolle.FlgBusteCartotecnica in ('B','C')  
            and  bolle.ClasseMerceologica  like '%%'                
            and DataFattura between '2010-01-01' and  '2010-11-30' 
        Group by CommercialeRiferimento,AnagraficaClientiPI.PartitaIVA,bolle.FlgBusteCartotecnica,ClasseMerceologica            
) as Periodo0 on 
    b.CommercialeRiferimento = Periodo0.CommercialeRiferimento 
    and b.CodiceClientePI = Periodo0.CodiceClientePI 
    and b.FlgBusteCartotecnica = Periodo0.FlgBusteCartotecnica 
    and b.ClasseMerceologica = Periodo0.ClasseMerceologica  
left join  (                        
    select distinct                                          
        if (CodiceCommRif is null, '', DescrizioneCommRif) as CodiceCommercialeRiferimento, 
        CommercialeRiferimento,
        trim(concat(bolle.CodiceCliente, ' - ', AnagraficaClientiPI.RagioneSociale1)) as CodiceClientePI,
        trim(concat(AnagraficaClientiPI.PartitaIVA, ' - ', AnagraficaClientiPI.RagioneSociale1)) as PartitaIVA,
        bolle.FlgBusteCartotecnica,
        if(DescrizioneCLM is null, '', DescrizioneCLM) as ClasseMerceologica,     开发者_开发百科         
        sum(if (TipoDocumento = 'N', -ValoreConsegnato, ValoreConsegnato)) as V              
    from bolle              
    inner join bollevalori on bolle.recordid = bollevalori.recordid         
    left join CodiciCommercialiRiferimento on CodiceCommRif = CommercialeRiferimento        
    inner join AnagraficaClienti as anagraficaclientiPI on bolle.codicecliente = anagraficaclientiPI.codicecliente          
    left join classemerceologica on bolle.ClasseMerceologica = classemerceologica.CodiceCLM  
    where  
        CommercialeRiferimento in ('001')  
        and  AnagraficaClientiPI.PartitaIVA  in ('0569XXXX000')  
        and  bolle.FlgBusteCartotecnica in ('B','C')  
        and  bolle.ClasseMerceologica  like '%%'                
        and DataFattura between '2008-01-01' and  '2008-11-30' 
    Group by CommercialeRiferimento,AnagraficaClientiPI.PartitaIVA,bolle.FlgBusteCartotecnica,ClasseMerceologica            
) as Periodo3 on 
    b.CommercialeRiferimento = Periodo3.CommercialeRiferimento 
    and b.CodiceClientePI = Periodo3.CodiceClientePI 
    and b.FlgBusteCartotecnica = Periodo3.FlgBusteCartotecnica 
    and b.ClasseMerceologica = Periodo3.ClasseMerceologica  
left join  (                        
    select distinct                                          
        if (CodiceCommRif is null, '', DescrizioneCommRif) as CodiceCommercialeRiferimento, 
        CommercialeRiferimento,
        trim(concat(bolle.CodiceCliente, ' - ', AnagraficaClientiPI.RagioneSociale1)) as CodiceClientePI,
        trim(concat(AnagraficaClientiPI.PartitaIVA, ' - ', AnagraficaClientiPI.RagioneSociale1)) as PartitaIVA,
        bolle.FlgBusteCartotecnica,
        if(DescrizioneCLM is null, '', DescrizioneCLM) as ClasseMerceologica,              
        sum(if (TipoDocumento = 'N', -ValoreConsegnato, ValoreConsegnato)) as V              
    from bolle              
    inner join bollevalori on bolle.recordid = bollevalori.recordid         
    left join CodiciCommercialiRiferimento on CodiceCommRif = CommercialeRiferimento        
    inner join AnagraficaClienti as anagraficaclientiPI 
    on bolle.codicecliente = anagraficaclientiPI.codicecliente          
    left join classemerceologica on bolle.ClasseMerceologica = classemerceologica.CodiceCLM  
    where  
        CommercialeRiferimento in ('001')  
        and  AnagraficaClientiPI.PartitaIVA  in ('0569XXXX000')  
        and  bolle.FlgBusteCartotecnica in ('B','C')  
        and  bolle.ClasseMerceologica  like '%%'                
        and DataFattura between '2008-01-01' and  '2008-12-31' 
    Group by CommercialeRiferimento,AnagraficaClientiPI.PartitaIVA,bolle.FlgBusteCartotecnica,ClasseMerceologica            
) as Periodo4 on 
    b.CommercialeRiferimento = Periodo4.CommercialeRiferimento 
    and b.CodiceClientePI = Periodo4.CodiceClientePI 
    and b.FlgBusteCartotecnica = Periodo4.FlgBusteCartotecnica 
    and b.ClasseMerceologica = Periodo4.ClasseMerceologica 
where 
    Periodo0.V is not null 
    or Periodo3.V is not null 
    or Periodo4.V is not null 
Group by b.CommercialeRiferimento,b.PartitaIVA,b.FlgBusteCartotecnica,b.ClasseMerceologica;

The query was bigger, I reduced it so it keep the issue. Here the result:

"Comm. Rif."    PartitaIVA      "Tipo Prodotto" Cl.Merc.                              Periodo0  Periodo3    Periodo4
Stecca  "0569XXXX000 - POSTEM SPA"  B   "Commesse buste articoli speciali  B"   2199544.40      NULL        NULL
Stecca  "0569XXXX000 - POSTEM SPA"  B   "Inserti buste/sacchetti           B"   3627807.30      NULL        NULL
Stecca  "0569XXXX000 - POSTEM SPA"  B   "Prodotti finiti buste/sacchetti   B"   8007.80         NULL        NULL

So I've the two last columns empty (NULL), whereas I expected some values. I tried to remove the last sql code (group by) and surprisingly I get:

"Comm. Rif."    PartitaIVA      "Tipo Prodotto" Cl.Merc.                              Periodo0  Periodo3    Periodo4
Stecca  "0569XXXX000 - POSTEM SPA"  B   "Inserti buste/sacchetti           B"   3627807.30     NULL     NULL        
Stecca  "0569XXXX000 - POSTEM SPA"  B   "Prodotti finiti buste/sacchetti   B"   8007.80        NULL     NULL    
Stecca  "0569XXXX000 - POSTEM SPA"  B   "Commesse buste articoli speciali  B"   2199544.40     NULL     NULL    
Stecca  "0569XXXX000 - POSTEM SPA"  B   "Commesse buste articoli speciali  B"      NULL     3714106.25  4210464.05
Stecca  "0569XXXX000 - POSTEM SPA"  B   "Inserti buste/sacchetti           B"      NULL     2080109.06  2487643.18

Seems that grouping... doesn't group! :-( Any idea?


Group by is used with aggregate functions, this query has none.

If you perform a query like say:

select a, b, c from a_table group by a, b

You will get:

  • distinct values for a and b columns

  • an undetermined value for c

So that's why "grouping doesn't group", that's not how you do it.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜