3

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

日付範囲内のすべての注文を取得し、日付でグループ化し、すべての注文商品の価格を合計して、その日付のすべての注文の合計を取得するクエリを作成しようとしています。

私はこれを機能させています。次に、その日の合計金額と 7 日前の合計金額の差を選択する別の列を追加します。7 日前に注文がない場合、列は null になります。

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

select cast(o.ReceivedDate as date) as OrderDate, 
coalesce(count(orderItems.orderId), 0) as Orders,
coalesce(sum(orderItems.Price), 0) as Price
from [Order] o

left outer join (
        select o.Id as orderId, sum(ot.Price) as Price
        from OrderItem ot
        join [Order] o on ot.OrderId = o.Id
        where o.ReceivedDate >= @DateFrom and o.ReceivedDate <= @DateTo
        group by o.Id
) as orderItems on o.Id = orderItems.orderId

where o.ReceivedDate >= @DateFrom and o.ReceivedDate <= @DateTo
group by cast(o.ReceivedDate as date)
order by cast(o.ReceivedDate as date) desc

では、このクエリに他の列を追加するにはどうすればよいでしょうか? 私は次のようなことをする必要があります:

//pseudo 
if o.RecievedDate - 7 exists then orderItems.Price - Price from 7 days ago else null

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

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

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

ご覧のとおり、25日は7日前の注文なので差額が表示されています。24日はそうではないのでnullが表示されます。

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

4

2 に答える 2

2

left outer joinbetween[Orders]テーブルを使用している理由がわかりません。またthe subquery、注文アイテムのない注文はあり得ないため (一般的に):

結果を得るには、以下のように簡略化されたバージョンでCTE

SQL-FIDDLE-DEMO

;with cte as (
  select convert(date,o.ReceivedDate) orderDate,
       count(distinct o.Id) as Orders,
       coalesce(sum(ot.Price),0) as Price
  from OrderItem ot
        join [Order] o on ot.OrderId = o.Id
  where o.ReceivedDate >= @DateFrom and o.ReceivedDate <= @DateTo
  group by convert(date,o.ReceivedDate)
)
select c1.orderDate, c1.Orders, c1.Price, c1.Price-c2.Price DIFF7DAYS
from cte c1 left join cte c2 on dateadd(day,-7,c1.orderdate) = c2.orderdate
order by c1.orderdate desc


|  ORDERDATE | ORDERS | PRICE | DIFF7DAYS |
-------------------------------------------
| 2013-01-25 |      3 |    38 |        28 |
| 2013-01-24 |      1 |    12 |    (null) |
| 2013-01-23 |      1 |    10 |    (null) |
| 2013-01-22 |      1 |    33 |    (null) |
| 2013-01-18 |      1 |    10 |    (null) |
| 2013-01-10 |      1 |     3 |       -43 |
| 2013-01-08 |      2 |    11 |    (null) |
| 2013-01-04 |      1 |     1 |    (null) |
| 2013-01-03 |      3 |    46 |    (null) |
于 2013-03-13T23:13:51.870 に答える
1

一時テーブルを使用して、datediff に結合します。

DECLARE @DateFrom datetime
SET @DateFrom = '2012-12-02'

DECLARE @DateTo datetime
SET @DateTo = '2013-03-13'

CREATE TABLE #temp ( orderdate date, orders int, price money)
INSERT INTO #temp
SELECT cast(o.ReceivedDate AS date) AS OrderDate,
coalesce(count(orderItems.orderId), 0) AS Orders,
coalesce(sum(orderItems.Price), 0) AS Price
FROM [Order] o

LEFT OUTER JOIN (
SELECT o.Id AS orderId, sum(ot.Price) AS Price
FROM OrderItem ot
JOIN [Order] o ON ot.OrderId = o.Id
WHERE o.ReceivedDate >= @DateFrom AND o.ReceivedDate <= @DateTo
GROUP BY o.Id
) AS orderItems ON o.Id = orderItems.orderId

WHERE o.ReceivedDate >= @DateFrom AND o.ReceivedDate <= @DateTo
GROUP BY cast(o.ReceivedDate AS date)

SELECT t1.orderdate, t1.orders, t1.price, 
t1.price - t2.price AS diff7days
FROM #temp t1 LEFT JOIN #temp t2
ON datediff(DAY, t2.orderdate, t1.orderdate) = 7
ORDER BY t1.orderdate DESC

http://sqlfiddle.com/#!6/8b837/34

于 2013-03-13T23:07:39.897 に答える