0
SELECT (CASE WHEN ymd BETWEEN CURRENT_DATE -4 AND CURRENT_DATE -1 THEN '3day total' 
WHEN ymd BETWEEN CURRENT_DATE -11 AND CURRENT_DATE -1 THEN '10day total' 
WHEN ymd BETWEEN CURRENT_DATE -31 AND CURRENT_DATE -1 THEN '30day total' END) AS 'Period',
SUM(cost) cost
FROM table
WHERE ymd BETWEEN CURRENT_DATE -31 AND CURRENT_DATE -1
GROUP BY 1

結果は、実際には、1 ~ 3 日、4 ~ 10 日、11 ~ 30 日という期間のバケットが得られるようです。これは、重複する条件があり、SQL が最初の条件が満たされるとすぐに CASE ステートメントの処理を停止するためだと思います。

私が欲しいのは、各バケットの合計です (つまり、3 日間の合計、10 日間の合計、30 日間の合計)。

フィールドを追加せずにこれを行う方法はありますか?

PS - vsql (vertica) であるため、構文は従来の sql とは少し異なります。

4

4 に答える 4

1

1 つの合計ではなく 3 つの合計を作成し、単一の合計の期間を決定しようとする代わりに、条件を使用して各レコードをカウントする場所を決定します。

select
  sum(case when ymd between CURRENT_DATE - 4 and CURRENT_DATE - 1 then cost else 0 end) as '3day total',
  sum(case when ymd BETWEEN CURRENT_DATE - 11 and CURRENT_DATE - 5 then cost else 0 end) as '10day total',
  sum(case when ymd BETWEEN CURRENT_DATE - 31 and CURRENT_DATE - 12 then cost else 0 end) as '30day total'
from
  table
and
  ymd between CURRENT_DATE -31 and CURRENT_DATE -1
group by
  1

注: どの日付範囲をどこでカウントしたいのかわからないので、重複しないように作成しましたbetween。それでも重複させたい場合は、既に除外されているbetween値より後の値として使用する代わりに、単に比較を行うことができます。CURRENT_DATE - 1

編集:

結果を行で取得するには、選択間の結合を作成できます。

select '3day total' as period, sum(cost) as cost
from table
where ymd between CURRENT_DATE - 4 and CURRENT_DATE - 1
union all
select '10day total', sum(cost)
from table
where ymd BETWEEN CURRENT_DATE - 11 and CURRENT_DATE - 5
union all
select '30day total', sum(cost)
from table
where ymd BETWEEN CURRENT_DATE - 31 and CURRENT_DATE - 12
于 2014-02-27T23:47:23.087 に答える
0

バケットごとに異なるフィールドを使用してみてください。各バケットのコストを合計する必要があると想定していますTHEN cost。別のフィールドを合計する場合は、を変更する必要がある場合があります。

WHEREまた、クエリに句がありません。条件はANDステートメントで始まります。おそらくこれを修正する必要があります。

SELECT SUM(CASE WHEN ymd BETWEEN CURRENT_DATE -4 AND CURRENT_DATE -1 THEN cost ELSE 0 END) as '3day total',
SUM(CASE WHEN ymd BETWEEN CURRENT_DATE -11 AND CURRENT_DATE -1 THEN cost ELSE 0 END) as '10day total', 
SUM(CASE WHEN ymd BETWEEN CURRENT_DATE -31 AND CURRENT_DATE -1 THEN cost ELSE 0 END) as  '30day total' END) AS 'Period'
FROM table
WHERE ymd BETWEEN CURRENT_DATE -31 AND CURRENT_DATE -1
GROUP BY 1
于 2014-02-27T23:44:55.543 に答える
0

条件を逆にしてみてください:

SELECT (CASE WHEN ymd BETWEEN CURRENT_DATE -31 AND CURRENT_DATE -1 THEN '30day total' 
WHEN ymd BETWEEN CURRENT_DATE -11 AND CURRENT_DATE -1 THEN '10day total' 
WHEN ymd BETWEEN CURRENT_DATE -4 AND CURRENT_DATE -1 THEN '3day total' 
END) AS 'Period',
SUM(cost) cost
FROM table
WHERE ymd BETWEEN CURRENT_DATE -31 AND CURRENT_DATE -1
GROUP BY 1
于 2014-02-27T23:46:38.603 に答える