0

MS SQL Server 2008 で一部のデータに対して実行する必要があるクエリがあります。基本的に、3 つの一意のフィールドと、時間範囲に対して繰り返す必要がある 3 つのフィールドがあります。そのため、プライマリ select ステートメント内に 3 つのサブクエリを作成します。私は1つのサブクエリだけを試して、それを機能させてから、他の2つをコピーして貼り付け、日付範囲を変更しました。

これが私が思いついたSQLですが、エラーが発生します。プロシージャを作成する権限がないため、サブクエリを使用しようとしています。

SELECT
mon.description as ScriptName,
up0.pageseqnum as PageSeq,
usd.DisplayName as PageName,

--This subquery is the one week old data for the Response Time, Page Weight, and Number of Objects.
(SELECT
ROUND(AVG(CAST(up1.ResponseTime AS FLOAT)* 0.001),3) AS ResponseTime,
ROUND(AVG(CAST(up1.numbytes AS FLOAT)* 0.001), 3) AS NumberofKilobytes,
CONVERT(INT,AVG(up1.numobj),0) AS NumberOfObjects
FROM
table0 AS up1
WHERE
up1.Monitor_Id = up0.Monitor_id
AND up1.TestTime BETWEEN DATEADD(HOUR,4,'2012-05-14 00:00:00') AND DATEADD(HOUR,4,'2012-05-21 00:00:00')
AND ISNULL(up1.ContentMatchStatus,'0')= 0
AND up1.UserScriptStatus = 0
AND up1.TimeoutStatus = 0
AND up1.ResponseTime > 0
) AS CurrentWeek

FROM
table0 (nolock) AS up0
JOIN table1 usd ON up0.Monitor_Id=usd.monitor_id
and up0.PageSeqNum=usd.PageSeqNum
JOIN table3 mon on up0.Monitor_Id = mon.Monitor_id

WHERE
up0.Monitor_Id in (1, 2, 3, 4, 5, 6, 7, 8 ,9 ,10)

GROUP BY up0.Monitor_Id, mon.Description, up0.PageSeqNum, usd.DisplayName
ORDER BY mon.Description ASC;

結果セットにこれらの列が含まれていること、および現在の週の後にさらに 2 週間前のデータを追加できることを願っています! スクロールして、結果として私が話していることを確認してください。

                                | | CurrentWeek (サブクエリ) | OneWeekOld (サブクエリ) |
スクリプト名 | ページシーケンス | ページ名 | 応答時間 | キロバイト数 | オブジェクト数 | 応答時間 | キロバイト数 | オブジェクト数 |
テスト1 | 0 | ホーム | 1.2 | 50.23 | 56 | 1.2 | 50.23 | 56 |
テスト1 | 1 | 販売 | 2.2 | 50.23 | 56 | 1.2 | 50.23 | 56 |
テスト1 | 2 | 焼く | 3.2 | 50.23 | 56 | 1.2 | 50.23 | 56 |
テスト1 | 3 | ケーキ | ケーキ 4.2 | 50.23 | 56 | 1.2 | 50.23 | 56 |
テスト2 | 0 | ホーム | 1.2 | 50.23 | 56 | 1.2 | 50.23 | 56 |
テスト2 | 1 | 販売 | 2.2 | 50.23 | 56 | 1.2 | 50.23 | 56 |
テスト2 | 2 | 焼く | 3.2 | 50.23 | 56 | 1.2 | 50.23 | 56 |

どんな助けでも大歓迎です。

4

1 に答える 1

1

次のようなことを試してください:

SELECT  mon.description as ScriptName,
        up0.pageseqnum as PageSeq,
        usd.DisplayName as PageName,
        wk.ResponseTime,
        wk.NumberofKilobytes,
        wk.NumberOfObjects

FROM
table0 (nolock) AS up0
JOIN table1 usd ON up0.Monitor_Id=usd.monitor_id
and up0.PageSeqNum=usd.PageSeqNum
JOIN table3 mon on up0.Monitor_Id = mon.Monitor_id
CROSS APPLY (   SELECT  up1.Monitor_Id,
                        ROUND(AVG(CAST(up1.ResponseTime AS FLOAT)* 0.001),3) AS ResponseTime,
                        ROUND(AVG(CAST(up1.numbytes AS FLOAT)* 0.001), 3) AS NumberofKilobytes,
                        CONVERT(INT,AVG(up1.numobj),0) AS NumberOfObjects
                FROM table0 AS up1
                WHERE up1.TestTime BETWEEN DATEADD(HOUR,4,'2012-05-14 00:00:00') AND DATEADD(HOUR,4,'2012-05-21 00:00:00')
                AND ISNULL(up1.ContentMatchStatus,'0')= 0
                AND up1.UserScriptStatus = 0
                AND up1.TimeoutStatus = 0
                AND up1.ResponseTime > 0 
                GROUP BY up1.Monitor_Id) wk

WHERE up0.Monitor_Id in (1, 2, 3, 4, 5, 6, 7, 8 ,9 ,10)
AND up0.Monitor_Id = up1.Monitor_Id
ORDER BY mon.Description ASC;

スキーマを sqlfiddle.com に投稿した方が簡単です。それに対してクエリを作成して、必要なものを返すことができます。

また、SQL Server を使用していると想定しているため、APPLY を使用します。使用しているデータベース システムを指定してください。

于 2012-05-23T19:46:34.560 に答える