MYSQL - проблема с левым соединением - PullRequest
0 голосов
/ 01 декабря 2010

Я ищу ошибку в свинге Java (это не мой код), которая динамически генерирует запрос.Извините за большой запрос, но я должен сообщить об этом здесь:

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;

Запрос был больше, я уменьшил его, чтобы он сохранил проблему.Вот результат:

"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

Итак, у меня два последних столбца пустые (NULL), тогда как я ожидал некоторых значений.Я попытался удалить последний код SQL (сгруппировать по) и неожиданно получаю:

"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

Кажется, что группирование ... не группирует!:-( Есть идеи?

1 Ответ

0 голосов
/ 02 декабря 2010

Группировка по используется с агрегатными функциями, у этого запроса нет ни одного.

Если вы выполните запрос, например, скажем:

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

Вы получите:

  • отдельные значения для столбцов a и b

  • неопределенное значение для c

Так вот почему "группировка не группирует""Это не так, как вы делаете.

...