有什么样的机会来执行这个sql代码

时间:2014-11-27 13:21:54

标签: sql-server-2008-r2

在这段代码中我有2次选择我使用的次数更多,有可能写入变量或其他方式来执行这个吗?

Select  CASE WHEN (SELECT Sum(Menge-Geliefert) AS tReserviert FROM PendenzenZeilen INNER JOIN Pendenzen ON PendenzenZeilen.Buchungs_ID = Pendenzen.Buchungs_ID 
           WHERE Artikel_ID = Artikel.Artikel_ID AND Variante = ArtikelLager.Variante AND Pendenzen.Lagerort = 0 AND Pendenzen.Status > 1 and Pendenzen.Buchungstyp = 1) is null 
     THEN 0 
     ELSE (SELECT Sum(Menge-Geliefert) AS tReserviert FROM PendenzenZeilen INNER JOIN Pendenzen ON PendenzenZeilen.Buchungs_ID = Pendenzen.Buchungs_ID 
           WHERE Artikel_ID = Artikel.Artikel_ID AND Variante = ArtikelLager.Variante and Pendenzen.Lagerort = 0 AND Pendenzen.Status > 1 and Pendenzen.Buchungstyp = 1) END AS eReserviert, 

CASE WHEN (SELECT Sum(Menge-Geliefert) AS tBestellt FROM PendenzenZeilen INNER JOIN Pendenzen ON PendenzenZeilen.Buchungs_ID = Pendenzen.Buchungs_ID 
           WHERE Artikel_ID = Artikel.Artikel_ID AND Variante = ArtikelLager.Variante AND Pendenzen.Lagerort = 0 AND Pendenzen.Buchungstyp = 2) is null 
     THEN 0 
     ELSE (SELECT Sum(Menge-Geliefert) AS tBestellt FROM PendenzenZeilen INNER JOIN Pendenzen ON PendenzenZeilen.Buchungs_ID = Pendenzen.Buchungs_ID 
           WHERE Artikel_ID = Artikel.Artikel_ID AND Variante = ArtikelLager.Variante AND Pendenzen.Lagerort = 0 AND Pendenzen.Buchungstyp = 2) END AS eBestellt,

(ArtikelLager.Lagerstand 
- 
CASE WHEN (SELECT Sum(Menge-Geliefert) AS tReserviert FROM PendenzenZeilen INNER JOIN Pendenzen ON PendenzenZeilen.Buchungs_ID = Pendenzen.Buchungs_ID 
           WHERE Artikel_ID = Artikel.Artikel_ID AND Variante = ArtikelLager.Variante AND Pendenzen.Lagerort = 0 AND Pendenzen.Status > 1 and Pendenzen.Buchungstyp = 1) is null 
     THEN 0 
     ELSE (SELECT Sum(Menge-Geliefert) AS tReserviert FROM PendenzenZeilen INNER JOIN Pendenzen ON PendenzenZeilen.Buchungs_ID = Pendenzen.Buchungs_ID 
           WHERE Artikel_ID = Artikel.Artikel_ID AND Variante = ArtikelLager.Variante AND Pendenzen.Lagerort = 0 AND Pendenzen.Status > 1 and Pendenzen.Buchungstyp = 1) END 
+ 
CASE WHEN (SELECT Sum(Menge-Geliefert) AS tBestellt FROM PendenzenZeilen INNER JOIN Pendenzen ON PendenzenZeilen.Buchungs_ID = Pendenzen.Buchungs_ID 
           WHERE Artikel_ID = Artikel.Artikel_ID AND Variante = ArtikelLager.Variante AND Pendenzen.Lagerort = 0 AND Pendenzen.Buchungstyp = 2) is null 
     THEN 0 
     ELSE (SELECT Sum(Menge-Geliefert) AS tBestellt FROM PendenzenZeilen INNER JOIN Pendenzen ON PendenzenZeilen.Buchungs_ID = Pendenzen.Buchungs_ID 
           WHERE Artikel_ID = Artikel.Artikel_ID AND Variante = ArtikelLager.Variante AND Pendenzen.Lagerort = 0 AND Pendenzen.Buchungstyp = 2) END) AS eZumVerkauf  
from ((Artikel 
   inner join ArtikelLager on Artikel.Artikel_ID = ArtikelLager.Artikel_ID) 
   inner join ArtikelLieferanten on Artikel.Artikel_ID = ArtikelLieferanten.Artikel_ID) 
where ArtikelLager.Lager_ID = 0 and Artikel_Status = 0
order by Bezeichnung, Variante

我还需要在哪里使用eZumVerkauf,谢谢!!

1 个答案:

答案 0 :(得分:0)

我认为您需要在具有最严格条件的内部select中进行联接,然后使用结果。对于内部select,请尝试以下内容:

SELECT 
   z.Buchungs_ID, a.Artikel_ID, a.Variante          
   Menge-Geliefert as tReserviert, Lagerstand, p.Status, p.Buchungstyp
FROM 
   PendenzenZeilen z INNER JOIN 
   Pendenzen p ON 
   z.Buchungs_ID = p.Buchungs_ID INNER JOIN
   Artikel a on 
   p?.Artikel_ID = a.Artikel_ID INNER JOIN
   Variante v on
   a.Variante = v.Variante -- inner join ArtikelLieferant al on ??
WHERE 
   p.Lagerort = 0 AND 
   ((Status > 1 and p.Buchungstyp = 1) or p.Buchungstyp =2))

然后你可以在外部选择中应用你的case条件(不确定我是否因为某些条件缺失而需要它):

Select  
CASE WHEN tReserviert is null  THEN 0 
     when Buchungstyp = 1 then Sum(tReserviert) END AS eReserviert, 

CASE WHEN tReserviert is null THEN 0 
     when Buchungstyp = 2 then Sum(tReserviert) END AS eBestellt,

(Lagerstand 
- 
CASE WHEN tReserviert is null THEN 0 
     when Buchungstyp = 1 then Sum(tReserviert) END 
+ 
CASE WHEN tReserviert is null THEN 0 
     when Buchungstyp = 2 then Sum(tReserviert ) end AS eZumVerkauf  
from (inner SELECT) s