使用循环优化sql查询

时间:2013-10-08 14:31:49

标签: sql loops

假设我每个月都有一个表格。是否有可能以某种方式循环thruu这12列,所以我不必写12个不同的选择语句?

而不是

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问题。

7 个答案:

答案 0 :(得分: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 :(得分: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

答案 2 :(得分: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 

答案 3 :(得分:0)

如果这是SQL Transact / SQL Server,您可以使用EXEC sp_columns'' 它将返回指定表的所有数据及其列名和数据类型 检查此链接 - > http://technet.microsoft.com/en-us/library/aa259626(v=sql.80).aspx

然后您可以将其放入CURSOR,以处理每一列,检查此链接是否为光标 - > http://technet.microsoft.com/en-us/library/ms180169.aspx

答案 4 :(得分:0)

有一种循环数据库表和列的方法,但它不是这种情况的快捷方式,因为它需要比12行更多的代码。要了解它,这里是一个例子的链接:http://dushi.co.uk/2009/07/15/loop-through-database-tables-and-columns/

基本上,它会计算出有多少列,并为每个列生成一个选择查询。

答案 5 :(得分: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

答案 6 :(得分:0)

如果这是一个SQL Server 2005+数据库,我们可以采用略有不同的方法并使用PIVOT / UNPIVOT。这应该提供额外的可读性,以及未来的灵活性。

Here is the link详细的MSDN文章,附带示例。在这种情况下,UNPIVOT将成为解决方案。