1

こんにちは、私は SQL レポート作成にかなり慣れていませんが、一見難しい問題を抱えています (少なくとも私はそうだと思います ;-) 誰かが私が間違っていることを証明してくれることを期待しましょう!) 私は「年初来」レポートを作成中です。 、12 か月の移動平均値を含みます。これには、最大 23 か月前の利用可能なすべての結果を照会する必要があります (私のレポートの oldes 値は 12 か月前であるため)。私が今それを解決した方法(これは機能します)は、24個のデータセットを作成し、それぞれが1か月前にクエリを実行することです。つまり、ds1: 今月のクエリ、ds2: 先月のクエリ... ds24: 23 か月前のクエリ。

質問: これを 1 つのクエリに組み合わせる方法はありますか?

テーブルは次のようになります。

DATE       ID    VALUE        DESCRIPTION
1/1/2012   12    'Text here'  'Text here'

(単純化された、いくつかの iner 結合といくつかのパラメーターがあります) クエリは次のようになります。

SELECT COUNT  Date, ID, Value, Description 
FROM Table 
WHERE (Date BETWEEN @parFrom AND DATEADD(month, 1, @parFrom)) 
AND description = 'Text here' 

これが必要な理由は、使用可能なすべての値を含むデータセットがない場合、明らかにグラフを作成できないためです。

誰かが助けてくれることを願っています:)

4

2 に答える 2

0

このようなクエリでは、日付に共通テーブル式を使用するのが好きです。ソーステーブルによっては、これが最も簡単な答えではないかもしれませんが、すべての目的に適しています:

CREATE TABLE #Events
(id INT IDENTITY,
EventTypeID INT,
EventDate DATETIME)

INSERT INTO #Events
         (  EventTypeID, EventDate )
VALUES
         (   32,  '2012-1-1' ),
         (   4,  '2012-1-1' ),
         (   5,  '2012-2-3' ),
         (   4,  '2012-2-25' ),
         (   34,  '2012-3-1' ),
         (   4,  '2012-4-3' ),
         (   4,  '2012-4-16' )

;
WITH  MonthsCTE
        AS ( SELECT
               1 AS ID ,
               DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) AS MonthStart ,
               DATEADD(YEAR, -1,
                       DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)) AS YearEarlier
             UNION ALL
             SELECT
               ID + 1 ,
               DATEADD(MONTH, -1, MonthStart) ,
               DATEADD(YEAR, -1, DATEADD(MONTH, -1, MonthStart))
             FROM
               MonthsCTE
             WHERE
               DATEADD(MONTH, -1, MonthStart) > DATEADD(YEAR, -1, GETDATE())
           )
   SELECT
      MonthStart ,
      COUNT(#Events.EventTypeID)  AS TotalOccurances,
      COUNT(#Events.EventTypeID) /12 AS AverageOccurances
   FROM
      MonthsCTE
   LEFT OUTER JOIN #Events
   ON #Events.EventDate BETWEEN YearEarlier AND MonthStart
      AND #Events.EventTypeID = 4
   GROUP BY
      MonthStart


      DROP TABLE #Events

上記では、過去 12 か月とその 1 年前の日付を含む CTE (慣れていない場合は一時テーブルを考えてください) を作成しています。

次に、2 番目のクエリがそのテーブルをデータに結合し、CTE のフィールド間にあるすべてのデータを許可します。

于 2012-10-12T13:47:21.130 に答える
0

すべてのテーブルを 1 つに統合する方法を探していると思います。query.AM そうですね。もしそうなら 。

複数のクエリの結果を結合するには、たとえばユニオン クエリを使用します。ここにクエリがあります。

SELECT colA, colB FROM tableA WHERE colA > 1
UNION
SELECT colX, colA FROM tableB WHERE colA > 1

ここに役立つサンプルの一部を示します。

http://msdn.microsoft.com/en-us/library/ms180026%28v=sql.90%29.aspx

http://www.tizag.com/sqlTutorial/sqlunion.php

http://blog.sqlauthority.com/2009/03/11/sql-server-difference-between-union-vs-union-all-optimal-performance-comparison/

于 2012-10-12T12:44:10.990 に答える