3

クエリで作成した 2 つの CASE 関数を合計しようとしています。これらの列の両方を結果セットに返す必要がありますが、2 つの列の合計を別の列に「DegreeDays」として返す必要もあります。SUM 関数を試してみましたが、役に立ちませんでした。単純な「HeatingDegreeDays + CoolingDegreeDays AS DegreeDays」を試してみましたが、どちらも機能しませんでした。提案?

  ,CASE
    WHEN TempLow > 60.5                     THEN 0
    WHEN ((TempHigh + TempLow)/2) > 60.5    THEN ((60.5-TempLow)/4)
    WHEN  TempHigh >= 60.5                  THEN (((60.5 - TempLow)/2)-((TempHigh-TempLow)/4))
    WHEN TempHigh < 60.5                    THEN (60.5-(TempHigh+TempLow)/4)
   END AS HeatingDegreeDays

  ,CASE
    WHEN TempHigh < 66.25                   THEN 0
    WHEN ((TempHigh + TempLow)/2) < 66.25   THEN ((TempHigh-66.25)/4)
    WHEN  TempLow <= 66.25                  THEN (((TempHigh - 66.25)/2)-((66.25-TempLow)/4))
    WHEN TempLow > 66.25                    THEN ((TempHigh+TempLow)/2)-66.25
   END AS CoolingDegreeDays
4

4 に答える 4

4

次の式を繰り返すことができます。

  ,CASE
    WHEN TempLow > 60.5                     THEN 0
    WHEN ((TempHigh + TempLow)/2) > 60.5    THEN ((60.5-TempLow)/4)
    WHEN  TempHigh >= 60.5                  THEN (((60.5 - TempLow)/2)-((TempHigh-TempLow)/4))
    WHEN TempHigh < 60.5                    THEN (60.5-(TempHigh+TempLow)/4)
   END +
   CASE
    WHEN TempHigh < 66.25                   THEN 0
    WHEN ((TempHigh + TempLow)/2) < 66.25   THEN ((TempHigh-66.25)/4)
    WHEN  TempLow <= 66.25                  THEN (((TempHigh - 66.25)/2)-((66.25-TempLow)/4))
    WHEN TempLow > 66.25                    THEN ((TempHigh+TempLow)/2)-66.25
   END AS TotalDays

または、サブクエリ (または CTE) に入れて、次のように言うこともできます。

select . . .,
       (HeadingDegreeDays + CoolingDegreeDays) as TotalDays
于 2013-09-13T17:01:50.643 に答える
3

1 つの方法は、既存のクエリを単純に派生テーブルにすることです。

SELECT a.HeatingDegreeDays,
    a.CoolingDegreeDays,
    a.HeatingDegreeDays + a.CoolingDegreeDays as DegreeDays
FROM
(
    SELECT
      CASE
        WHEN TempLow > 60.5                     THEN 0
        WHEN ((TempHigh + TempLow)/2) > 60.5    THEN ((60.5-TempLow)/4)
        WHEN  TempHigh >= 60.5                  THEN (((60.5 - TempLow)/2)-((TempHigh-TempLow)/4))
        WHEN TempHigh < 60.5                    THEN (60.5-(TempHigh+TempLow)/4)
       END AS HeatingDegreeDays

      ,CASE
        WHEN TempHigh < 66.25                   THEN 0
        WHEN ((TempHigh + TempLow)/2) < 66.25   THEN ((TempHigh-66.25)/4)
        WHEN  TempLow <= 66.25                  THEN (((TempHigh - 66.25)/2)-((66.25-TempLow)/4))
        WHEN TempLow > 66.25                    THEN ((TempHigh+TempLow)/2)-66.25
       END AS CoolingDegreeDays
    FROM MyTable
) AS a; -- Derived tabled aliased as "a"

SQL Server 2005 以降を使用している場合、これはCommon Table Expression (CTE)と同様に機能します。

;WITH cte AS (
    SELECT
      CASE
        WHEN TempLow > 60.5                     THEN 0
        WHEN ((TempHigh + TempLow)/2) > 60.5    THEN ((60.5-TempLow)/4)
        WHEN  TempHigh >= 60.5                  THEN (((60.5 - TempLow)/2)-((TempHigh-TempLow)/4))
        WHEN TempHigh < 60.5                    THEN (60.5-(TempHigh+TempLow)/4)
       END AS HeatingDegreeDays

      ,CASE
        WHEN TempHigh < 66.25                   THEN 0
        WHEN ((TempHigh + TempLow)/2) < 66.25   THEN ((TempHigh-66.25)/4)
        WHEN  TempLow <= 66.25                  THEN (((TempHigh - 66.25)/2)-((66.25-TempLow)/4))
        WHEN TempLow > 66.25                    THEN ((TempHigh+TempLow)/2)-66.25
       END AS CoolingDegreeDays
    FROM MyTable
)
SELECT HeatingDegreeDays,
    CoolingDegreeDays,
    HeatingDegreeDays + CoolingDegreeDays as DegreeDays
FROM cte;

これらのいずれかは、計算を行うためだけにクエリのロジックとハードコードされた値を繰り返すよりも維持する方が良いようです。

于 2013-09-13T17:03:57.837 に答える
0

クエリの一部で列名を取得するSELECTと、他の部分でそれらを参照できなくなります。

次の 2 つの基本的なオプションがあります。

DegreeDays をSUM2 つのCASEステートメントの として定義する (すべてのロジックを繰り返す) か、次のようなことを行います。

select ...,HeatingDegreeDays,CoolingDegreeDays,DegreeDays=HeatingDegreeDays+CoolingDegreeDays
from table
cross apply (select
CASE
    WHEN TempLow > 60.5                     THEN 0
    WHEN ((TempHigh + TempLow)/2) > 60.5    THEN ((60.5-TempLow)/4)
    WHEN  TempHigh >= 60.5                  THEN (((60.5 - TempLow)/2)-((TempHigh-TempLow)/4))
    WHEN TempHigh < 60.5                    THEN (60.5-(TempHigh+TempLow)/4)
   END AS HeatingDegreeDays

  ,CASE
    WHEN TempHigh < 66.25                   THEN 0
    WHEN ((TempHigh + TempLow)/2) < 66.25   THEN ((TempHigh-66.25)/4)
    WHEN  TempLow <= 66.25                  THEN (((TempHigh - 66.25)/2)-((66.25-TempLow)/4))
    WHEN TempLow > 66.25                    THEN ((TempHigh+TempLow)/2)-66.25
   END AS CoolingDegreeDays
) x
于 2013-09-13T17:05:18.127 に答える