0

これを行おうとしている 7 か月をカバーする 2 つの列から毎日の SUM を返す必要がありますが、これには時間がかかりすぎます。一度に1日ずつインクリメントされた順番でこれらを返す方法はありますか?

select SUM(TotalBet)SALES, SUM(TotalWin)PRIZES from play nolock where CurrentDate between '1/1/2013 07:00:00' and '1/2/2013 7:00:00'

select SUM(TotalBet)SALES, SUM(TotalWin)PRIZES from play nolock where CurrentDate between '1/2/2013 07:00:00' and '1/3/2013 7:00:00'

select SUM(TotalBet)SALES, SUM(TotalWin)PRIZES from play nolock where CurrentDate between '1/3/2013 07:00:00' and '1/4/2013 7:00:00'

select SUM(TotalBet)SALES, SUM(totalbet)PRIZES from play nolock where CurrentDate between '1/4/2013 07:00:00' and '1/5/2013 7:00:00'

select SUM(TotalBet)SALES, SUM(TotalWin)PRIZES from play nolock where CurrentDate between '1/5/2013 07:00:00' and '1/6/2013 7:00:00'

select SUM(TotalBet)SALES, SUM(TotalWin)PRIZES from play nolock where CurrentDate between '1/6/2013 07:00:00' and '1/7/2013 7:00:00'
4

3 に答える 3

1

数字の表を使用して日付を生成し、表に結合して日ごとにグループ化します。テーブルに直接移動することもできますが、日付が欠落している場合 (休日など)、数値テーブルがないと結果に表示されません。

SELECT 
   D.Date, SUM(TotalBet) as Sales, SUM(TotalBet) as Prizes
FROM (
   SELECT DATEADD(dd, CONVERT(datetime, '2013-01-01 07:00'), Number) as Date
   FROM dbo.NumbersTable(0, 210) --210 days
) as D
LEFT OUTER JOIN Play as P ON
   P.CurrentDate >= D.Date AND P.CurrentDate < D.Date
GROUP BY
   D.Date

また、(おそらく) BETWEEN を使用しないことをお勧めします。これは、境界で重複が発生する可能性があるためです (BETWEEN は両側で包括的です)。

于 2013-07-08T14:10:44.613 に答える
1

集計が必要です。重要なのは、 を に変換するdatetimeことdateです。正しい日付を取得するには、7 時間を引きます。

select cast(CurrentDate - 7.0/24 as date) as thedate,
       SUM(TotalBet) as SALES, SUM(totalbet) as PRIZES
from play nolock
group by cast(CurrentDate - 7.0/24 as date)
order by 1;
于 2013-07-08T14:11:30.603 に答える