2013-10-08 72 views
0

可以說我有一個表,每個月有一列。是否有可能循環throwu這12列不知何故,所以我不必寫12種不同的選擇語句?優化一個循環的sql查詢

而不是

SELECT a.ArtikelName,a.Number, 
jan = (SELECT b.Month1 FROM Budget b LEFT OUTER JOIN on b.number = a.number), 
feb = (SELECT b.Month2 FROM Budget b LEFT OUTER JOIN on b.number = a.number), 
mar = (SELECT b.Month3 FROM Budget b LEFT OUTER JOIN on b.number = a.number), 
apr = (SELECT b.Month4 FROM Budget b LEFT OUTER JOIN on b.number = a.number), 
may = (SELECT b.Month5 FROM Budget b LEFT OUTER JOIN on b.number = a.number), 
FROM Artikel a 

我可以以某種方式使一個循環在這裏和去thruu不同的月份?由於月份數除外,這正是desame問題。

+0

你應該停止使用相關子查詢,它們基本上condeming查詢按行業績排。他們是最後的手段。幾乎所有的人都可以輕鬆地用連接來替代。你也應該停止考慮循環記錄,從數據庫的角度來看這是一件壞事,你在數據集上工作而不是循環記錄。 – HLGEM

回答

2

加入Budget一次Artikel

SELECT a.ArtikelName,a.Number, 
jan = b.Month1, 
feb = b.Month2, 
FROM Artikel a 
LEFT OUTER JOIN Budget b on b.number = a.number 

順便說一句,我從來沒有見過你的奇怪的LEFT JOIN語法。我甚至都不明白它的意思。大家都知道並理解,使用標準的JOIN語法可能會更好。

1

事情是這樣的:

SELECT a.ArtikelName,a.Number, 
b.Month1 as Jan, 
b.Month2 as Feb 
... etc. 
FROM Artikel a 
LEFT OUTER JOIN Budget b on b.number = a.number 
0

您可以使用JOINS

SELECT a.artikelname, 
     a.number, 
     jan = b.month1, 
     feb = b.month2, 
     mar = b.month3, 
     apr = b.month4, 
     may = b.month5 
FROM artikel a 
     LEFT OUTER JOIN budget b 
        ON b.number = a.number 
0

我的壞榜樣哦對不起我的查詢方式比我的例子更加複雜。

我張貼我的原單的查詢。而是每個月複製這麼多的代碼,我想知道如果我做一個循環有..保持查詢總之我只顯示例如用第2個月

SELECT d.Keyword1, 
Jan = ((SELECT CONVERT(INTEGER, Sum(Isnull(a.PlanAbsatz_Mt1,0))) 
FROM dbo.JSBudgetDetail a 
      LEFT OUTER JOIN dbo.JSBudgetHeader b ON b.ID = a.HeaderID 
      LEFT OUTER JOIN dbo.Art c ON a.Artikel = c.number 
      WHERE b.VersionNotActive = 0 and b.Markt=2800 and c.ArtMisC2No=10 and c.ArtMisC5No=2014 and c.ArtMisC1No = 1011 and b.VerkRegion = 'default' and c.ArtMisC3No = 4160 and c.Number=d.Number)) , 
Feb = ((SELECT CONVERT(INTEGER, Sum(Isnull(a.PlanAbsatz_Mt2,0))) 
FROM dbo.JSBudgetDetail a 
      LEFT OUTER JOIN dbo.JSBudgetHeader b ON b.ID = a.HeaderID 
      LEFT OUTER JOIN dbo.Art c ON a.Artikel = c.number 
      WHERE b.VersionNotActive = 0 and b.Markt=2800 and c.ArtMisC2No=10 and c.ArtMisC5No=2014 and c.ArtMisC1No = 1011 and b.VerkRegion = 'default' and c.ArtMisC3No = 4160 and c.Number=d.Number)) 
From Art d 
LEFT OUTER JOIN JSBudgetDetail e ON e.Artikel = d.Number 
LEFT OUTER JOIN JSBudgetHeader f ON f.ID = e.HeaderID 
WHERE f.VersionNotActive = 0 and d.ArtMisC2No = 10 and d.ArtMisC5No = 2014 and f.Markt = 2800 and d.ArtMisC1No = 1011 and d.ArtMisC3No = 4160 and f.VerkRegion = 'default' 
GROUP BY d.Keyword1, d.Number 
ORDER BY d.Keyword1 
0

如果這是一個SQL Server數據庫2005+ ,我們可以採取稍微不同的方法並使用PIVOT/UNPIVOT。這應該提供額外的可讀性以及未來的靈活性。

Here is the link的詳細MSDN文章,以實例。在這種情況下,UNPIVOT將是解決方案。