2012-07-02 2 views
0

우리는이 같은 결과 테이블에 7 일간 데이터를 얻을 필요가있는 보고서를 사용하여 삽입 :SQL은 루프 (열 이름이 루프에 따라 다름) 동안

declare @table table (ProductId int, product nvarchar(255), supplier nvarchar(255), day1 int, day2 int, day3 int, day4 int, day5 int, day6 int, day7 int) 

그러나 문제는 내가 그 현재 거의 동일하게 insert 문을 실행하십시오.

insert @table (ProductId, product, supplier, day1) 
select 
    productId, 
    product, 
    supplier, 
    COUNT(productId) 
from 
    @results 
where 
    createdDate = @Date 
group by 
    CreatedDate, ProductId, Product, supplier 

이 일하지만 난 그냥 @date

을 변경 .... DAY2, day3와 동일한 작업을 수행해야 DAY1에 삽입 내가 할 좋아 삽입하는 루프를 만드는 것입니다 것이다 무엇 현재의 루프 (즉, is day1, day2 ...)에 따라 올바른 열로 이동하십시오.

insert 문에 대한 올바른 열 이름을 동적으로 설정하는 방법이 있습니까?

내가 사용하고 있습니다 : SQL 서버 2008R2

답변

2

당신은 SQL-Server 2008의 PIVOT 기능을 이용하여 하나 개의 쿼리에서 모든 삽입을 수행하려고 할 수 없습니다? 당신이있어, 당신의 일 가정입니다

연속, 그리고 혹시 SQL 문제를 처리 할 때 자신이 루프의 사용에 대해 askign 찾을 경우 열 등

;WITH Data AS 
( SELECT ProductID, 
      Product, 
      Supplier, 
      DATEDIFF(DAY, @Date, CreatedDate) + 1 AS DayNumber, 
      ProductID AS [Counter] 
    FROM @Results 
    WHERE CreatedDate BETWEEN @Date AND DATEADD(DAY, 7, @Date) 
) 
INSERT @table (ProductID, Product, Supplier, Day1, Day2, Day3, Day4, Day5, Day6, Day7) 
SELECT * 
FROM Data 
     PIVOT 
     ( COUNT([Counter]) 
      FOR DayNumber IN ([1], [2], [3], [4], [5], [6], [7]) 
     ) pvt 
1

첫째날, 둘째 날입니다 아마도 적절한 사고 방식으로 문제에 접근하지 못했을 것입니다.

아래의 출발점.

SELECT productId 
     , product 
     , supplier 
     , day1 = SUM(CASE WHEN createdDate = @date THEN 1 ELSE 0 END) 
     , day2 = SUM(CASE WHEN createdDate = DATEADD(d,1,@date) THEN 1 ELSE 0 END)... 


FROM @results 
WHERE createdDate >= @Date 
GROUP BY CreatedDate 
     , ProductId 
     , Product 
     , supplier 
0

대신 다음과 같이하고, 나는이 테이블 수는 하루에 수를 저장하는, DAY_COUNT라는 두 개 이상의 열을 가지고 목표 테이블 구조를 변경하는 것이 좋습니다 및 createdDate

create table @table (productId int,product int, supplier int, 
    createdDate date,day_count int) 

것 원하는 출력

를 얻을 수

insert @table (ProductId, product, supplier,createdDate, day_count) 
select 
    productId, 
    product, 
    supplier, 
    createdDate, 
    COUNT(productId) 
from 
    @results 
where 
    createdDate between @Date and dateadd(dd, 7, @Date) 
group by 
    CreatedDate, ProductId, Product, supplier 

아래의 쿼리를 사용하여 그리고 아래의 쿼리를 사용 채워

declare @startDate date ='2012-07-02'; 
with cte as(
select productId ,product , supplier ,createdDate, datediff(dd, 
    @startDate,createdDate)+1 [day_num], 
    day_count from #tmp) 
select productId ,product , supplier ,createdDate , 
case when day_num=1 then day_count end [day1], 
case when day_num=2 then day_count end [day2], 
case when day_num=3 then day_count end [day3], 
case when day_num=4 then day_count end [day4], 
case when day_num=5 then day_count end [day5], 
case when day_num=6 then day_count end [day6], 
case when day_num=7 then day_count end [day7] 
    from cte