1

「注文」というテーブル名があります。

今月の週ごとの総注文額を計算したい。

現在、以下のクエリを使用して、月ごとに合計注文を取得できます:-

SELECT 
                    "Month" = month(o.OrderDate)
                     , "Year" = year(o.OrderDate)
                     , Amount = sum(o.Total)
                FROM
                    Orders o
                WHERE
                    o.OrderDate >= convert(DATETIME, '1/1/2013 12:00:00 AM')
                    AND o.OrderDate < convert(DATETIME, '12/31/2013 12:00:00 AM')
                GROUP BY
                    month(o.OrderDate)
                  , year(o.OrderDate)
                ORDER BY
                    year(o.OrderDate)
                  , month(o.OrderDate)

しかし今、私は怒鳴るのように週ごとにこのデータを取得したい:-

毎年約52週間あるので、データは次のようになります:-

週 年 金額 1 2013 200 2 2013 500 ....... 52 2013 0

前もって感謝します。

4

3 に答える 3

3

DATEPARTを使用して週番号を取得できます。

その週に登録がない場合でも、各週の行を取得するには、数値テーブルを使用して、注文テーブルに左結合することができます。

このクエリは2013、たまたま53週がある年を返します。

select N.Number as [Week],
       2013 as [Year],
       sum(O.Total) as Amount
from dbo.Numbers as N
  left outer join dbo.Orders as O    
    on n.Number = datepart(week, O.OrderDate) and
       O.OrderDate >= '20130101' and
       O.OrderDate < '20140101'
where n.Number between 1 and 53
group by N.Number
order by N.Number;

数値テーブルを持っていない、または作成したくない場合は、代わりにこれを使用して、クエリで作成します。

select N.Number as [Week],
       2013 as [Year],
       sum(O.Total) as Amount
from (
     select top (53) row_number() over(order by 1/0) as Number
     from sys.all_objects
     ) as N
  left outer join dbo.Orders as O    
    on n.Number = datepart(week, O.OrderDate) and
       O.OrderDate >= '20130101' and
       O.OrderDate < '20140101'
where n.Number between 1 and 53
group by N.Number
order by N.Number;
于 2013-10-24T05:53:24.800 に答える
2

以下のようにしてみてください

           SELECT 
                 DATEPART (wk, o.OrderDate)as week,                    
                 year(o.OrderDate) as year
                 , Amount = sum(o.Total)
            FROM
                Orders o
            WHERE
                o.OrderDate >= convert(DATETIME, '1/1/2013 12:00:00 AM')
                AND o.OrderDate < convert(DATETIME, '12/31/2013 12:00:00 AM')
            GROUP BY
                DATEPART(wk, o.OrderDate)
              , year(o.OrderDate)
            ORDER BY
                year(o.OrderDate)
              , DATEPART(wk, o.OrderDate)
于 2013-10-24T05:55:10.140 に答える
0

これを試してみてください
。値が 1 ~ 53 の数値テーブルを取得し、このテーブルとの外部結合を残してください。データのない週の結果は 0 になります。

       select numbers.value,numbers.[Year],amt from numbers left outer join (
        SELECT 
             DATEPART (wk, o.OrderDate)as week,                    
             2013 as [Year],
             ,sum(o.Total)as amt
        FROM
            Orders o
        WHERE
            o.OrderDate >= convert(DATETIME, '1/1/2013 12:00:00 AM')
            AND o.OrderDate < convert(DATETIME, '12/31/2013 12:00:00 AM')
        GROUP BY
            DATEPART(wk, o.OrderDate)
          , year(o.OrderDate)
        ORDER BY
            year(o.OrderDate)
          , DATEPART(wk, o.OrderDate)
      )data on data.week=numbers.value
于 2013-10-24T06:44:50.887 に答える