1

次のようなSalesという名前のテーブルがあるとします。

 Year Quarter Sales
 2012    4     5000
 2013    1     6111
 2013    2     7222

そして、四半期ごとの売上高の増加を比較しようとしているので、最終的には次のようになります。

Q1 Q2 Sales Difference
 4  1      1111
 1  2      1111

前年の第4四半期と翌年の第1四半期を比較する方法を思い付くのに苦労しています。

ここでは、同じ年の四半期に機能するソリューションとともに、同様のテーブルを使用してSQLFiddleを設定しました。

4

3 に答える 3

2

どうですか:

select a.Year, a.Quarter as Q1, ISNULL(b.Quarter, c.Quarter) as Q2, ISNULL(b.Sales, c.Sales) - a.Sales AS [Sales Increase]
from Sales a
left join Sales b on a.Quarter = b.Quarter - 1 and a.Year = b.Year
left join Sales c on a.Quarter = 4 and c.Quarter = 1 and a.Year = c.Year - 1

SQLフィドル(2014年第5四半期を第1四半期に変更していますが...)

于 2013-02-21T20:44:48.720 に答える
2

別のオプション

WITH QuarterlySales AS (
    SELECT Sales.Quarter, Sales.Year, DateAdd(q,Sales.Quarter,CAST('01/01/'+CAST(YEAR AS CHAR(4)) AS DATE)) AS QDate
        , Sales
    FROM Sales)
SELECT b.[Quarter] as [Q1], a.[Quarter] AS [Q2], 
        a.Sales - b.Sales AS [Sales Increase]
FROM QuarterlySales a 
LEFT JOIN QuarterlySales b 
    ON a.[QDate] = DateAdd(q,1,b.[QDate])

このパフォーマンスが@chrisbよりも良いか悪いかはわかりません。テーブルのスキャンは1回少なくなりますが、インデックスではおそらくうまくいきません。より大きな例でそれがどのように機能するかを知りたいと思います。

于 2013-02-21T20:49:19.717 に答える
1

CTEを使用すると、コードを整理してクリーンに保つのに役立つことがわかりました。数値を再フォーマットし、Q4を翌年のQ1と一致させる必要がある厄介な部分は、そこで処理でき、メインのクエリは簡単です。

with NewSales (QtrDate, DisplayDate, Year, Quarter, Sales) as (
    select
      Year - 0.25 + (Quarter / 4.0) as QtrDate,
      cast(Year as varchar(10)) + '-Q' + cast(Quarter as varchar(10)) as DisplayDate,
      Year, Quarter, Sales
    from
      @sales
)



select
  a.DisplayDate, a.Sales, 
  b.DisplayDate, b.Sales,
  b.Sales - a.Sales as SalesIncrease,
  (b.Sales / (a.Sales * 1.0)) - 1 as SalesPctIncrease

from
  NewSales a left outer join
    NewSales b on a.QtrDate + 0.25 = b.QtrDate

where
    a.Sales is not null and b.Sales is not null

四半期のフォーマットとパーセンテージの計算に少しフレア(最低限:)を追加しました。これらの例を使用して、必要に応じて出力をカスタマイズできます。

于 2013-02-21T22:35:06.680 に答える