2013-10-08 3 views
0

매월 한 열에 테이블이 있다고 가정 해 보겠습니다. 12 개의 다른 select 문을 쓸 필요가 없으므로이 열을 어떻게 든 반복 할 수 있습니까? 대신루프를 사용하여 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 갈 수 있습니까? 달 번호를 제외하고는 그 질문이 옳지 않기 때문입니다.

+0

상관 관계가있는 하위 쿼리 사용을 중단해야합니다. 본질적으로 쿼리를 행 성능별로 비난하고 있습니다. 그들은 최후의 수단입니다. 거의 모든 항목을 조인으로 쉽게 대체 할 수 있습니다. 레코드를 루핑하는 생각을 멈추어야하는데, 이것은 데이터베이스 용어로는 좋지 않습니다. 레코드를 순환하지 않는 데이터 세트로 작업하십시오. – HLGEM

답변

2

Artikel에 한 번 Budget에 가입하세요.

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

, BTW 나는 당신의 이상한 LEFT JOIN 구문을 본 적이 없다. 나는 그것이 의미하는 바를 심지어 이해하지 못합니다. 모든 사람이 알고 이해할 수있는 표준 JOIN 구문을 사용하는 것이 좋습니다. 이 같은

1

뭔가 : 이것은 당신이이 모든 데이터를 반환하는 EXEC의 sp_columns '' 를 사용할 수있는 SQL 거래/SQL 서버 인 경우

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

데이터베이스 테이블과 열을 순환시키는 방법이 있지만이 경우에는 훨씬 더 많은 코드가 필요하기 때문에이 경우에는 지름길이 아닙니다. 12 라인. http://dushi.co.uk/2009/07/15/loop-through-database-tables-and-columns/

Basicly 그것은 얼마나 많은 열을 계산하고 각각에 대해 선택 쿼리를 생성 : 주위가 여기를 예의 링크입니다.

0

잘 못 견디는 나의보기를 위해 나의 질문은 나의보기보다는 더 복잡하다.

나는 원래의 쿼리를 게시합니다. 대신 매달에 너무 많은 코드를 복사하는 나는 이것이 SQL 서버 2005 + 데이터베이스 인 경우 짧은 나는 단지 첫째 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

와 예제를보기 내가 쿼리를 유지하려면 .. 거기 루프을 알고 싶어요 약간 다른 접근 방식을 취할 수 있으며 PIVOT/UNPIVOT을 사용할 수 있습니다. 이렇게하면 향후 가독성과 유연성이 향상됩니다. 예제와 함께 자세한 MSDN 문서에

Here is the link. 이 경우 UNPIVOT이 해결책이됩니다.