假设我每个月都有一个表格。是否有可能以某种方式循环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问题。
答案 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
将成为解决方案。