1

特定の月/年に基づいて列の数を選択しています。先月と比較したそのカウントのパーセンテージの差を返す必要があります。

これが私がこれまでに持っているものです。これは、必要なもの (現在の月数) の前半を返します。

select 
    o.productName, COUNT(*) as totalSales 
from 
    order o
inner join 
    product p on o.productID=p.productID
where 
    datePart(month, dateTimeReceived) = 2
    and datePart(year, dateTimeReceived) = 2012         
group by 
    o.productName
order by 
    totalSales desc

したがって、この出力は次のようになります

Widget 1  - 200 sold
Widget 2  - 190 sold

繰り返しますが、前月からの変化率を示す 3 番目の列も含めたいと思います。

また、私がどのように選択してdatePartいるかに関して、私は暖かい曖昧さを感じていません。

4

2 に答える 2

2

必要な結果を生成するには、いくつかの方法があります。これは、CTE を使用して両方の月の合計を計算し、それを結合して元に戻します。

With cte as 
(
SELECT 

       o.productname, 
       Datepart(month, datetimereceived) m,
       Count(*) AS totalSales 
FROM   order o 
       INNER JOIN product p 
               ON o.productid = p.productid 
WHERE  Datepart(month, datetimereceived) in ( 2, 2-1) 
       AND Datepart(year, datetimereceived) = 2012 
GROUP  BY o.productname, 
       Datepart(month, datetimereceived) 
ORDER  BY totalsales DESC )
SELECT 
      a.productName ,
      a.totalSales,
      a.totalSales / b.totalSales percentage_of_prevous_month

FROM 
      cte a 
      INNER JOIN cte b 
      ON a.productname = b.productname
         and a.month = b.month - 1

一部欠品があります。除算の結果が数値 < 0 になる場合、おそらく実際にはゼロ以外の値を取得するようなことをする必要があります

cast(a.totalSales as decimal)/ cast( b.totalSales  as decimal) 

また、このように月の入力を使用すると、入力が 1 月の場合に問題が発生します。したがって、datetimerecived を月の最初に正規化したほうがよいでしょう。

例えば

SELECT および Group by の変更

   CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(@mydate)-1),datetimerecieved),101) m

変更された WHERE

   CONVERT(VARCHAR(25),DATEADD(dd,-(DAY(datetimerecieved)-1),datetimerecieved),101)
                  in ( '2/1/2012', DateAdd(m,-1,'2/1/2012'))

変更された

a.M > b.M
于 2012-06-26T05:26:32.177 に答える
1

EDITED:パーセンテージ列についてのビットを読んでいませんでした。これは、productName、currentMonth、previousMonth、および percentChange の 4 つの列を返します。ISNULL 関数は、「ゼロ除算」エラーを防ぐためにあります。これを proc に適合させて、CurrentYear および CurrentMonth パラメーターを渡すだけで済みます。または、1 つの datetime パラメーターを渡して、そこから月/年を計算するか、GETDATE() を使用してパラメーターを渡さないようにすることもできます。

declare @CurrentYear int,
    @CurrentMonth int,
    @previousYear int,
    @previousMonth int

set @CurrentYear = 2012
set @CurrentMonth = 2

if @CurrentMonth = 1 begin
    set @previousMonth = 12
    set @previousYear = @CurrentYear - 1
end else begin
    set @previousMonth = @CurrentMonth - 1
    set @previousYear = @CurrentYear
end

select  productName,
    (select COUNT(*) 
    from    [order] o 
    where   DATEPART(year, dateTimeReceived) = @CurrentYear
    and DATEPART(month, dateTimeReceived) = @CurrentMonth
    and o.productid = p.productid) as currentMonth,
    (select COUNT(*) 
    from    [order] o 
    where   DATEPART(year, dateTimeReceived) = @previousYear
    and DATEPART(month, dateTimeReceived) = @previousMonth
    and o.productid = p.productid) as previousMonth,
    convert(decimal(10, 2), 100*(
    (select COUNT(*) 
    from    [order] o 
    where   DATEPART(year, dateTimeReceived) = @CurrentYear
    and DATEPART(month, dateTimeReceived) = @CurrentMonth
    and o.productid = p.productid) 
    -
    (select COUNT(*) 
    from    [order] o 
    where   DATEPART(year, dateTimeReceived) = @previousYear
    and DATEPART(month, dateTimeReceived) = @previousMonth
    and o.productid = p.productid)
    /
    NULLIF(
    (select COUNT(*) 
    from    [order] o 
    where   DATEPART(year, dateTimeReceived) = @previousYear
    and DATEPART(month, dateTimeReceived) = @previousMonth
    and o.productid = p.productid), 0))) as percentChange
from    product p
于 2012-06-26T09:20:24.203 に答える