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.
精彩评论