我有一张桌子:
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的总数,而不显式输入任何数据(例如月份)?
答案 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,以避免这种陷阱。