3

我有一张桌子:

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 的总数,而不显式输入任何数据(例如月份)?

4

2 回答 2

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
于 2012-05-10T05:29:07.147 回答
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 月的汇总值都将记录在 Destination_Table 中的日期 2006-10-01 之下。

我认为,表达式会生成一个 DATE,它应该自动转换为DATETIME。如果没有,那么您可能需要使用 DATETIMEFROMPARTS(),为时间分量指定零。

您可能还需要担心两个“门”列中的 NULL,因为您的练习桌不禁止它们。如果是这样,那么您可能使用SUM(door_one) + SUM(door_two). 像这样的聚合SUM将忽略 NULL(或将它们视为零,如果您愿意),但如果您编写door_one + door_two并且其中一个或另一个为 NULL,则加法的结果将为 NULL,因此有效的非空值之一将是忽略。单独进行聚合可以避免这个问题。一般来说,我建议在任何可能的地方添加 NOT NULL,正是为了避免这样的陷阱。

于 2012-05-10T05:26:48.083 回答