0

私は上司から、データベース内のすべてのテーブル (道路の各代表と交通量の合計数) を検索し、オートバイの時間ごとの合計数を取得するクエリを作成するように依頼されました。1つのテーブルでテストしているときにこれまでに得たものは次のとおりです。

    WITH
totalCount AS
(
 SELECT DATEDIFF(dd,0,event_time) AS DaySerial,
        DATEPART(dd,event_time) AS theDay,
        DATEDIFF(mm,0,event_time) AS MonthSerial,
        DATEPART(mm,event_time) AS MonthofYear,
        DATEDIFF(hh,0,event_time) AS HourSerial,
        DATEPART(hh,event_time) AS Hour,
        COUNT(*) AS HourlyCount,
        DATEDIFF(yy,0,event_time) AS YearSerial,
        DATEPART(yy,event_time) AS theYear    
   FROM [RUD].dbo.[10011E]
   WHERE length <='1.7'
  GROUP BY DATEDIFF(hh,0,event_time), 
           DATEPART(hh,event_time),
           DATEDIFF(dd,0,event_time), 
           DATEPART(dd,event_time),
           DATEDIFF(mm,0,event_time), 
           DATEPART(mm,event_time),
           DATEDIFF(yy,0,event_time), 
           DATEPART(yy,event_time)
)
    SELECT 
        theYear,
        MonthofYear,
        theDay,
        Hour,
        AVG(HourlyCount) AS Avg_Count                   
    FROM 
        totalCount
    GROUP BY 
        theYear,
        MonthofYear,
        theDay,
        Hour
    ORDER BY
        theYear,
        MonthofYear,
        theDay,
        Hour

これで、これのいくつかは冗長であるか不要であると確信しています。今のところは問題ありません(SQLは初めてなので、一部が冗長になる理由です)。基本的には、1 本の道路のバイクの年月日、時間、時間ごとの台数を記載しています。今私の2つの質問:

  1. このクエリを取得して、RUD データベース内のすべてのテーブルを検索するようにするにはどうすればよいでしょうか? それらをすべてリストしてUNIONするだけですか、それとももっと簡単な方法がありますか?

  2. 上記 (年、月、日、時間、毎時のカウント) のみを収集するすべてのテーブルを検索すると、正しいデータが得られますが、すべてのカウントがどの道路から来ているのかを区別する方法はありません。テーブル ID (この例では、10011E が ID で、特定の道路に割り当てられた名前) を選択し、そこから選択された行の隣の列に配置する方法はありますか?

誰かが私が何を意味するかについて明確にする必要がある場合は、私に知らせてください! ありがとう!

4

1 に答える 1

0

1 つのオプションはUNION ALL、どのソースに対して追加の列を使用して追加することです。この場合、各テーブルを書き出す必要がありますが、おそらく最速のオプションです。

SELECT ID, 'YourTable' TableName
FROM YourTable
UNION ALL
SELECT ID, 'YourOtherTable' 
FROM YourOtherTable
....

別の方法として、動的 SQL を使用しても同じ結果が得られる可能性があります。すべてのテーブル名を入力する必要はないかもしれませんが、パフォーマンスが低下します。

于 2013-03-05T04:27:50.697 に答える