MYSQL - проблема с левым соединением

0

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

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 (group by) и неожиданно получаю:

"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

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

  • 0
    Не могли бы вы попытаться выбрать SUM() из трех столбцов «V»? И я не думаю, что вам понадобится предложение WHERE ..
  • 0
    Сумма кажется работой !!! Вы можете объяснить, почему? Я думаю, ГДЕ для других условий, это сгенерированный запрос.
Показать ещё 1 комментарий
Теги:
left-join

1 ответ

0

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

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

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

Вы получите:

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

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

Итак, почему "группировка не группируется", это не то, как вы это делаете.

  • 0
    Спасибо за ваш ответ, но я думаю, что это не вопрос. По сути, я проверил это снова, и если я изменил четыре вхождения "in ('001')" в "like" 001 ", он работает нормально. Если я изменю это снова в "= '001'", это не сработает. Читая с dev.mysql.com/doc/refman/5.0/en/… Я заметил некоторые различия между LIKE и операторами =, я думаю, что причина (возможно, пробел или другой 'collate').

Ещё вопросы

Сообщество Overcoder
Наверх
Меню