不确定如何从一个表中获取数据并将其移动到另一个表中

时间:2012-05-10 05:04:09

标签: sql sql-server-2008 tsql

我有一张桌子:

create table practice_table
(
    traffic_date    datetime ,
    door_one        integer ,
    door_two    integer 
)

使用一些示例数据:

insert into practice_table(traffic_date, door_one, door_two) values ('12-Oct-2006' ,14500 ,11141)
insert into practice_table(traffic_date, door_one, door_two) values ('13-Oct-2006' ,6804 ,5263)
insert into practice_table(traffic_date, door_one, door_two) values ('14-Oct-2006' ,7550 ,6773)
insert into practice_table(traffic_date, door_one, door_two) values ('15-Oct-2006' ,6144 ,5211)
insert into practice_table(traffic_date, door_one, door_two) values ('16-Oct-2006' ,5680 ,3977)
insert into practice_table(traffic_date, door_one, door_two) values ('17-Oct-2006' ,5199 ,3918)
insert into practice_table(traffic_date, door_one, door_two) values ('18-Oct-2006' ,5298 ,3631)

我正在尝试将其移动到另一个包含列的表(名为destination_table)中:

月(日期时间) traffic_count(整数)

如何在SQL中创建一个循环,在新表中为10月创建一行,其中包含door_one和door_two的总数,而不显式输入任何数据(例如月份)?

2 个答案:

答案 0 :(得分:5)

你可以使用光标,但如果我明白你想要做什么,那就不必了。

;WITH tmp AS (
    SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, traffic_date), 0) AS month_field, door_one, door_two
    FROM practice_table
)
INSERT INTO destination_table (month, traffic_count)
SELECT month_field, SUM(door_one + door_two)
FROM tmp
GROUP BY month_field

答案 1 :(得分:3)

你不创建一个循环;你使用INSERT / SELECT组合。

SQL Server 2008:

INSERT INTO Destination_Table(Month, Traffic_Count)
    SELECT DATEADD(day, 1 - DAY(traffic_date), traffic_date),
           SUM(door_one + door_two)
      FROM Practice_Table
     GROUP BY DATEADD(day, 1 - DAY(traffic_date), traffic_date)

SQL Server 2012:

INSERT INTO Destination_Table(Month, Traffic_Count)
    SELECT DATEFROMPARTS(YEAR(traffic_date), MONTH(traffic_date), 1),
           SUM(door_one + door_two)
      FROM Practice_Table
     GROUP BY DATEFROMPARTS(YEAR(traffic_date), MONTH(traffic_date), 1)

在这两种情况下,对于样本数据,2006年10月的汇总值都将在2006-10-01的Destination_Table中记录。

表达式生成一个DATE,我认为应该自动转换为DATETIME。如果没有,那么你需要使用DATETIMEFROMPARTS(),大概是为时间组件指定零。

您可能还需要担心两个“门”列中的NULL,因为您的练习表不会禁止它们。如果是这样,那么您可能使用SUM(door_one) + SUM(door_two)。像SUM这样的聚合将忽略NULL(或者如果你愿意,可以将它们视为零),但如果你写door_one + door_two而另一个是NULL,那么加法的结果将是NULL,所以实际上,将忽略其中一个非空值。单独执行聚合可以避免此问题。一般来说,我建议在任何可能的地方添加NOT NULL,以避免这种陷阱。