0

Lets say i have a table with one column for every month. Is it possible to Loop thruu this 12 columns somehow so i don't have to write 12 different select Statements?

Instead of

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

Can i somehow make a Loop here and go thruu the different months? Because except of the monthnumber it's exactly desame question.

4

7 回答 7

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使用每个人都知道和理解的标准语法可能会更好。

于 2013-10-08T14:35:41.887 回答
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
于 2013-10-08T14:35:49.527 回答
0

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

这是详细的 MSDN 文章的链接,带有示例。在这种情况下,UNPIVOT将是解决方案。

于 2013-10-08T14:48:54.950 回答
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 
于 2013-10-08T14:36:33.687 回答
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
于 2013-10-08T14:46:39.990 回答
0

有一种方法可以遍历数据库表和列,但它不是这种情况的捷径,因为它需要的代码比 12 行多得多。要使用它,这里是一个示例的链接:http: //dushi.co.uk/2009/07/15/loop-through-database-tables-and-columns/

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

于 2013-10-08T14:43:40.577 回答
0

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

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

于 2013-10-08T14:38:47.837 回答