1

以下のような単純な SQL クエリがあります。

select   ProjectNo,
         CostCat,
         SummaryCostCat,
         CreditorEmployeeName,
         UnitCost,
         TotalCost,
         TransactionDate
from dbo.NGPCostPosition

これにより、以下のようなデータが選択されます。

ここに画像の説明を入力

私がやりたいのは、「CurrentValue」と呼ばれるデータに新しい列を作成することです。これは、当月のトランザクション日付に基づいてすべての TotalCost 値を計算するものです。

理想的には、私が新しい月に変わるにつれて、これは変わるでしょう.

この例は、以下の画像です:-

ここに画像の説明を入力

ここで、CurrentValue は当月の数値を表します。

4

3 に答える 3

13

これは、日時を文字列に変換してから日付に戻す、またはDATEPART列に対して使用する「トリック」とは異なり、インデックスを使用します。

WHERE TransactionDate >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)
AND TransactionDate < DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())+1, 0);

整頓?

DECLARE @ms SMALLDATETIME, @me SMALLDATETIME;
SET @ms = DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0);
SET @me = DATEADD(MONTH, 1, @ms);

SELECT
...
WHERE TransactionDate >= @ms AND TransactionDate < @me;

絶えず変化する要件では、上記の @ms/@me 変数を使用してから、次のようにします。

CurrentValue = CASE 
  WHEN TransactionDate >= @ms AND TransactionDate < @me
  THEN TotalCost END

またTransactionDate、何らかの集計を実行する場合は、グループ化列に含めないでください。実際に必要な結果を示していただければ、クエリ全体を作成できます。列リストとグループ化は一見しただけでは意味がありませんでした。そのため、実際の質問に基づいてそれらを隠して、実際のWHERE節に集中できるようにしました。 .

于 2013-03-19T16:00:48.667 に答える
0

DATEPART 関数を使用して、月と年を確認できます。

WHERE DATEPART(month, GETDATE()) = DATEPART(month, Date)) 
AND (DATEPART(year, GETDATE()) = DATEPART(year, Date)
于 2013-03-19T16:01:55.620 に答える
0
select   ProjectNo,
         CostCat,
         SummaryCostCat,
         CreditorEmployeeName,
         UnitCost,
         TotalCost,
         TransactionDate,
         CASE WHEN DATEPART(month, TransactionDate) = DATEPART(month, GETDATE()) AND
                   DATEPART(year, TransactionDate) = DATEPART(year, GETDATE()) THEN
                     TotalCost
               ELSE NULL
          END AS CurrentValue
from dbo.NGPCostPosition
于 2013-03-19T22:39:50.063 に答える