0

我们有一个报告需要将 7 天的数据放入结果表中,如下所示:

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)

然而问题是我目前运行 7 个几乎相同的插入语句。

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

这个插入到第 1 天,但是我必须对第 2 天、第 3 天做同样的事情......只需更改@Date

我想做的是创建一个循环,该循环将根据当前循环插入正确的列(即正在处理第 1 天或第 2 天......)。

有没有办法将其动态设置为插入语句的正确列名?

我正在使用:sql server 2008R2

4

3 回答 3

2

您不能尝试使用 SQL-Server 2008 中的 PIVOT 函数在一个查询中执行全部插入操作吗?

我假设你的日子是连续的,你的专栏是 Day1、Day2 等。

;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
于 2012-07-02T11:58:20.867 回答
1

如果您发现自己在处理 SQL 问题时对循环的使用提出了疑问,那么您可能没有以适当的思维方式解决问题。

下面的起点。

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 
于 2012-07-02T12:00:31.710 回答
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
于 2012-07-02T12:17:06.053 回答