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 と呼ばれる) に移動しようとしています。

month (日時) traffic_count (整数)

SQL でループを作成して、データ (月など) を明示的に入力せずに、door_one と door_two の合計で新しいテーブルに 10 月の行を 1 つ作成するにはどうすればよいですか?

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 サーバー 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 月 1 日の日付で記録されます。

式は DATE を生成しますが、これは自動的にDATETIMEに変換されるはずです。そうでない場合は、おそらく時間コンポーネントにゼロを指定して、DATETIMEFROMPARTS() を使用する必要があります。

練習テーブルでは禁止されていないため、2 つの「ドア」列の NULL についても心配する必要があるかもしれません。もしそうなら、おそらく使用しますSUM(door_one) + SUM(door_two)。のような集計SUMは NULL を無視します (または、必要に応じてゼロとして扱います) が、書き込んdoor_one + door_twoでどちらか一方が NULL の場合、加算の結果は NULL になるため、事実上、非 null 値の 1 つが次のようになります。無視されます。集計を個別に行うと、この問題を回避できます。一般に、このような落とし穴を正確に回避するために、可能な限りどこでも NOT NULL を追加することをお勧めします。

于 2012-05-10T05:26:48.083 に答える