1
ID    M1      M2       M3    M4       DateM2        DateM3      DateM4 
1     2       NULL     NULL  NULL     NULL          NULL        NULL
2     NULL     2       1     1        11.11.2011    15.11.2011  20.11.2011
3     1       NULL     NULL  NULL     NULL          NULL        NULL
4     2       3        1     2        11.12.2012    12.12.2012  13.12.2012
5     1       1        1     1        11.10.2012    12.10.2012  13.10.2012
6     2       2        2     2        12.9.2012     12.12.2012  1.2.2013

ID列と新しい列を持つ次のテーブルを作成したい

ID M1+M2+M3+M4
1  2
2  4
3  1
4  8
5  4
6  8

新しい列は、次のルールで M1+M2+M3+M4 になります。

  1. M1 は常に合計に追加され、その null の場合は 0 に設定します
  2. DateM2 が NULL ではなく、かつ DATE1 < DateM2 < DATE2 の場合、M2 が合計に追加されます。
  3. DateM3 が NULL ではなく、かつ DATE1 < DateM3 < DATE2 の場合、M3 が合計に追加されます。
  4. DateM4 が NULL ではなく、かつ DATE1 < DateM4 < DATE2 の場合、M4 が合計に追加されます。

DATE1 と DATE2 はクエリで指定された変数です。これに関する私の問題は、パフォーマンスに何を使用すればよいかわかりません。何万ものレコードがあります。select case を使用する必要があります。

4

2 に答える 2

2

このようなもの:

SELECT
t.ID,
isnull(t.M1,0)+
CASE WHEN t.DateM2 is not null AND @DATE1 < t.DateM2 < @DATE2
     THEN t.M2
     ELSE 0 END +
CASE WHEN t.DateM3 is not null AND @DATE1 < t.DateM3 < @DATE2
     THEN t.M3 
     ELSE 0 END +
CASE WHEN t.DateM4 is not null AND @DATE1 < t.DateM4 < @DATE2
     THEN t.M4 
     ELSE 0 END AS 'M1+M2+M3+M4'
FROM Table1 t
于 2012-12-16T13:59:22.117 に答える
1

これを試して:

DECLARE @Date1 AS DATETIME
DECLARE @Date2 AS DATETIME
SET @Date1 = '01 Jan 1900' -- ここで日付を設定
SET @Date2 = '01 Jan 1900' -- ここで日付を設定

SELECT ID, ISNULL(M1,0) +
CASE WHEN DateM2 IS NOT NULL AND DateM2 BETWEEN @Date1 AND @Date2 THEN ISNULL(m2,0) ELSE 0 END +
CASE WHEN DateM3 IS NOT NULL AND DateM3 BETWEEN @Date1 AND @Date2 THEN ISNULL(m3,0) ELSE 0 END +
CASE WHEN DateM4 IS NOT NULL AND DateM4 BETWEEN @Date1 AND @Date2 THEN ISNULL(m4,0) ELSE 0 END
AS [NameOfColumnHere]
FROM [TablenameHere]

于 2012-12-16T13:50:45.833 に答える