0

SQL Server 2012 を使用しています。製品の注文を保持するテーブルが 2 つあります。受信日を持つ注文と、価格と注文 ID fk を持つ OrderItem。

注文を日付別にグループ化し、その日付の注文数と合計金額を取得するクエリがあります。7日前との注文数の差の欄もあります。

ただし、過去 7 日間のすべての注文の平均も取得したいと考えています。

したがって、現時点では以下のクエリがあります。

declare @DateFrom datetime
set @DateFrom = '2012-12-01'

declare @DateTo datetime
set @DateTo = '2013-03-13'

;with orders as (
    select 
    cast(o.ReceivedDate as date) as OrderDate, 
    count(oi.Id) as Orders,
    coalesce(sum(oi.Price), 0) as Price
    from OrderItem oi 
    join [Order] o on oi.OrderId = o.Id
    where cast(o.ReceivedDate as date) >= @DateFrom 
    and cast(o.ReceivedDate as date) <= @DateTo
    group by cast(o.ReceivedDate as date)
)

select c1.OrderDate,
c1.Price,
c1.Orders,
c1.Orders - c2.Orders as DIFF7DAYS
from orders c1
left join orders c2 on dateadd(day, -7, c1.OrderDate) = c2.OrderDate
order by c1.OrderDate desc

次に、過去 7 日間の平均注文を取得する別の列を追加します。

私は次のようなことを試しました:

select c1.OrderDate,
c1.Price,
c1.Orders,
c1.Orders - c2.Orders as DIFF7DAYS,
c3.AverageOrders
from orders c1
left join orders c2 on dateadd(day, -7, c1.OrderDate) = c2.OrderDate
left join (
select OrderDate, avg(Orders) as AverageOrders
from orders
group by OrderDate
) as c3 on c3.OrderDate >= dateadd(day, -7, c1.OrderDate) and c3.OrderDate <= c1.OrderDate     and c3.OrderDate = c1.OrderDate
order by c1.OrderDate desc

しかし、私が何をしているようには見えません。また、結合から c3.OrderDate = c1.OrderDate を削除しようとしましたが、平均に影響する行が重複しています。基本的に、結果に列を追加したい:

select avg(Orders) as AverageOrders
from orders
where OrderDate >= (the current order - 7 days) and OrderDate <= (the current order)

しかし、これを行う方法がわかりませんか?http://sqlfiddle.com/#!6/8b837/44の説明に役立つ sqlfiddle を作成しました

私のサンプルデータから、私が達成したいのは次のような結果です:

|  ORDERDATE | ORDERS | PRICE |  DIFF7DAYS  | AVERAGE |
-------------------------------------------------------
| 2013-01-25 |      7 |    38 |           6 |       2 |
| 2013-01-24 |      2 |    12 |        null |       1 |
| 2013-01-23 |      1 |    10 |        null |       1 |
| 2013-01-22 |      1 |    33 |        null |
| 2013-01-18 |      1 |    10 |        null |
| 2013-01-10 |      1 |     3 |          -2 |
| 2013-01-08 |      2 |    11 |        null |
| 2013-01-04 |      1 |     1 |        null |
| 2013-01-03 |      3 |    46 |        null |

ご覧のとおり、過去 7 日間 (25、24、23、22、18) の丸め平均は 2 であるため、25 日の平均は 2 です。

また、これを拡張して、30 日間の平均を示す別の列を追加できるようにしたいと考えています。

どんな助けでも大歓迎です。

4

1 に答える 1

0

私はあなたの質問を理解していると 100% 確信しているわけではありませんが、あなたはSUM過去 7 日間の [注文] 列をそれで割っCOUNTAVG. その場合、これは提供された Fiddle を使用して機能するはずです。

declare @DateFrom datetime
    set @DateFrom = '2012-12-01'

    declare @DateTo datetime
    set @DateTo = '2013-03-13'

    ;with orders as (
        select 
        cast(o.ReceivedDate as date) as OrderDate, 
        count(oi.Id) as Orders,
        coalesce(sum(oi.Price), 0) as Price
        from OrderItem oi 
        join [Order] o on oi.OrderId = o.Id
        where cast(o.ReceivedDate as date) >= @DateFrom 
        and cast(o.ReceivedDate as date) <= @DateTo
        group by cast(o.ReceivedDate as date)
    ),
    totals as (
      select c1.OrderDate,
      c1.Price,
      c1.Orders,
      c1.Orders - c2.Orders as DIFF7DAYS, 
      ROW_NUMBER() OVER (ORDER BY c1.OrderDate DESC) rn
      from orders c1
      left join orders c2 on dateadd(day, -7, c1.OrderDate) = c2.OrderDate

  ) 
Select t.OrderDate, t.Price, t.Orders, t.Diff7Days,
  SUM(t2.Orders)/COUNT(t2.Orders) avg
FROM totals t
LEFT JOIN totals t2 on t.rn + 7 > t2.rn and t2.rn >= t.rn
GROUP BY t.OrderDate, t.Price, t.Orders, t.Diff7Days
order by t.OrderDate desc

SQL フィドルのデモ

7 日分のデータがないレコードに NULL が必要な場合は、CASEチェックする簡単なステートメントでCOUNTそれを判断できます。

于 2013-03-18T23:20:59.620 に答える