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

Sql 不确定如何从一个表中获取数据并将其移动到另一个表中,sql,sql-server-2008,tsql,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 pra

我有一张桌子:

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)中,该表包含以下列:

月份(日期时间) 流量/单位计数(整数)


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

您不创建循环;使用插入/选择组合

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日期下的目的地表中

这些表达式会生成一个日期,我认为应该自动转换为。如果不是,那么您将需要使用DATETIMEFROMPARTS(),大概是为时间组件指定零


您可能还需要担心两个“door”列中的null,因为您的练习表并不禁止它们。如果是这样,那么您可能会使用
SUM(door\u one)+SUM(door\u two)
。像
SUM
这样的聚合将忽略空值(或者将它们视为零,如果您愿意),但是如果您编写
door\u one+door\u two
并且其中一个或另一个为空,那么加法的结果将为空,因此实际上将忽略一个非空值。单独进行聚合可以避免此问题。一般来说,我建议尽可能在任何地方添加NOT NULL,以避免出现这种情况。

您可以使用游标,但如果我理解您的意图,那么就没有必要了

;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

您能展示一下您的示例输出吗?我想知道是否真的有必要将其移到新表中。我认为您应该使用View来管理它,而不是将其移动到新表中。我认为在SQL Server之前,
datefromparts
不可用2012@adrift:噢,谢谢你的提醒。这就是在SQL中处理日期的问题;每个DBMS都有自己的系统,互不兼容。是的,谷歌发给我的页面看起来确实是针对SQLServer2012的(尽管搜索中包含了2008)。因此,正如我所怀疑的,日期计算需要由本地SQL Server人员进行调整;基本技术是正确的,但日期计算的细节是。。。难以捉摸的我通常写
MDY(月(流量日期),1,年(流量日期))
而不是(Informix);相同的基本思想,只是不同的符号。