2

(SQL Server 2008を使用)ビューを作成してからビューでクエリを作成すると、これを簡単に機能させることができますが、これを1つのSQLクエリで実行したいと思います。2つの列(DeliveredDate(DateTime)、Delivered(Varchar))を含むテーブルがあります。最初にDeliveredDateをDateのみに変換し、次にDateでグループ化します。同時に、Count on Deliveredを実行しています(列はYESまたはNULLのいずれかです)。これが私がこの部分を達成するために使用するものです:

  SELECT CAST([DeliveredDate] As Date),
         COUNT([Delivered])
  FROM [TableName]
  GROUP BY CAST([DeliveredDate] As Date)
  ORDER BY CAST([DeliveredDate] As Date)

出力として、次のようなものが得られます。

DeliveredDate  |  Delivered
 2012-04-24          10
 2012-04-25         500
 2012-04-26         422
 2012-04-27          33

私が探しているのは次のようなものです。

DeliveredDate  |  Delivered  |  RunningTotal
 2012-04-24          10            10
 2012-04-25         500           510
 2012-04-26         422           932
 2012-04-27          33           965

私はそこで見たさまざまな例を試しましたが、カウントとそのカウントでRunningTotalを実行するこのシナリオに一致するものはないようです。

4

2 に答える 2

3

SUMの順序付きOVER句を実装する製品を使用している場合は、次のように実行できます。

select
  cast(DeliveredDate as date) as DeliveredDate,
  count(Delivered) as Delivered,
  sum(count(Delivered)) over (
    order by DeliveredDate
  ) as RunningTotal
from Orders
group by OrderDate
order by OrderDate;

あなたの表現カウント(配信済み)は少し奇妙です。念のために言っておきますが、これは、[配信済み]列の値がNULLではない特定の日付の行数をカウントします。

于 2012-05-04T14:14:33.663 に答える
1

CTEがビューとしてカウントされるかどうかはわかりませんが、これはSUMの順序付きOVER句をサポートしないSQL2005+で機能します。

WITH cte (DeliveredDate, Delivered)
     AS (SELECT Cast([DeliveredDate] AS DATE) DeliveredDate, 
                Count([Delivered]) Delivered 
         FROM   [TableName] 
         GROUP  BY Cast([DeliveredDate] AS DATE)) 
SELECT d1.delivereddate, 
       d1.delivered, 
       Sum(d2.Delivered) RunningTotal 
FROM   cte d1 
       LEFT JOIN cte d2 
         ON d1.delivereddate >= d2.DeliveredDate 
GROUP  BY d1.delivereddate, 
          d1.delivered 
ORDER BY d1.delivereddate
于 2012-05-04T14:19:04.630 に答える