QUERY SQL WITH JOIN

时间:2014-04-29 10:26:16

标签: sql sql-server-2008-r2

我需要有关合并2查询的帮助。

QUERY 1:

SELECT  anag.Negozio,anag.NomeNegozio, 
ISNULL(SUM(ven.Quantita), 0) as PezziVenduti, 
ISNULL(SUM(ven.Valore*ven.Quantita), 0) as TotaleVendite 
FROM Dylog_NOL_Anagrafica AS anag 
LEFT JOIN Dylog_NOL_Movimento AS ven ON anag.IDAnagrafica=ven.IDAnagrafica AND ven.TipoMovimento='VE' 
WHERE anag.PortalID=709 AND anag.Negozio IN ('02', '01') 
GROUP BY anag.Negozio, anag.NomeNegozio 
HAVING ISNULL(SUM(ven.Quantita), 0)<>0 

结果:

NEGOZIO|NOMENEGOZIO    |PezziVenduti|TOTALE VENDITE
     01|SEDE PRINCIPALE|           2|         51,78

QUERY 2

SELECT  anag.Negozio,anag.NomeNegozio, 
ISNULL(SUM(res.Quantita), 0) as PezziResi,
ISNULL(SUM(res.Valore*res.Quantita), 0) as TotaleResi 
FROM Dylog_NOL_Anagrafica AS anag 
LEFT JOIN Dylog_NOL_Movimento AS res ON anag.IDAnagrafica=res.IDAnagrafica AND res.TipoMovimento='RC' 
WHERE anag.PortalID=709 AND anag.Negozio IN ('02', '01') 
GROUP BY anag.Negozio, anag.NomeNegozio 
HAVING ISNULL(SUM(res.Quantita), 0)<>0

结果:

NEGOZIO|NOMENEGOZIO    |PEZZIRESI|TOTALERESI
     01|SEDE PRINCIPALE|        1|     25,89

MERGE:

SELECT DISTINCT anag.Negozio,anag.NomeNegozio, 
ISNULL(SUM(ven.Quantita), 0) as PezziVenduti, 
ISNULL(SUM(ven.Valore*ven.Quantita), 0) as TotaleVendite, 
ISNULL(SUM(res.Quantita), 0) as PezziResi,
ISNULL(SUM(res.Valore*res.Quantita), 0) as TotaleResi 
FROM Dylog_NOL_Anagrafica AS anag 
LEFT JOIN Dylog_NOL_Movimento AS ven ON (anag.IDAnagrafica=ven.IDAnagrafica AND ven.TipoMovimento='VE') 
LEFT JOIN Dylog_NOL_Movimento AS res ON (anag.IDAnagrafica=res.IDAnagrafica AND res.TipoMovimento='RC')
WHERE anag.PortalID=709 AND anag.Negozio IN ('02', '01') 
GROUP BY anag.Negozio, anag.NomeNegozio 
HAVING ISNULL(SUM(ven.Quantita), 0)<>0 
OR ISNULL(SUM(res.Quantita), 0)<>0

结果:

NEGOZIO|NOMENEGOZIO    |PEZZI VENDUTI|TOTALE VENDITE|**PEZZI RESI|TOTALE RESI**
     01|SEDE PRINCIPALE|            2|         51,78|         **2|      51,78**

为什么错误的现场“PEZZI RESI”?正确的价值是1。

2 个答案:

答案 0 :(得分:0)

我认为问题是{/ 1}}

OR

根据您的逻辑(ISNULL(SUM(PezziVenduti), 0) <> 0 OR ISNULL(SUM(PezziResi), 0) <> 0 ),您可以使用IsNull(Sum(..)

答案 1 :(得分:0)

而不是“ISNULL(SUM(ven.Quantita),0)作为PezziVenduti”使用“ven.Quantita”。其他IsNull条目也是如此。这显然不是你想要的,但你会允许你看到一个你没想到的额外行。额外的左连接很可能导致额外的行总和。您可以使用一个左连接并在select中使用case语句来过滤TipoMovimento上的总和。希望这有帮助

;with Returned_And_Sold as 
(
Select ID,
     Type,
     case when type = 'VE' then isnull(sum(M.Quantity),0) end as QuantitySold,
     case when type = 'VE' then isnull(sum(M.Quantity*M.Value),0) end as TotalSold,
     case when type = 'RC' then isnull(sum(M.Quantity),0) end as QuantityReturned,
     case when type = 'RC' then isnull(sum(M.Quantity*M.Value),0) end as TotalReturned
 from dbo.Dylog_NOL_Movimento M
 where m.type in ('VE','RC')
 group by ID,Type
 having isnull(sum(M.Quantity), 0) <> 0
)

 select 
    A.Shop,
    A.StoreName,
    S.QuantitySold,
    S.TotalSold,
    S.QuantityReturned,
    S.TotalReturned 
 from Dylog_NOL_Anagrafica A 
 left JOIN Returned_And_Sold S on 
 S.ID = A.ID