我必须为我的餐厅生成每日销售报告。 餐厅将于凌晨4:00开放,第二天凌晨3:59关闭。
查询每日销售情况如下:
select DATENAME(month, sa.StartDate) 'Month Name',
datename(dw,sa.StartDate)'Day',
Convert(Varchar,CONVERT(date,sa.StartDate),103) 'Date',
CONVERT(DECIMAL(10,2), SUM(sa.OrigionalSubTotal) / 100.0) 'Gross Sales'
from Store st,
Sale sa
where
st.StoreID = sa.StoreID and st.StoreID =xxxxxx
and sa.StartDate >= '2015-05-01 04:00:01' and sa.StartDate <= '2015-05-02 03:59:00'
group by st.StoreName,CONVERT(date, sa.StartDate),
datename(dw,sa.StartDate),
DATENAME(month, sa.StartDate)
order by Convert(Varchar,CONVERT(date,sa.StartDate),103)
这里我从5月1日开始销售。那是5月1日上午4:00到5月2日早上3:59 AM,因为将查询与日期名称和日期分组,如果在上午12:00之后发生任何销售,它将给出两行
示例:
May Friday 01/05/2015 500
May Saturday 02/05/2015 250
实际上两个销售都应该在周五进行,因为查询中的日期和日期会分成两个。
实际输出应为
May Friday 01/05/2015 750
我不能在开始日期使用min()函数来获取日期名称和日期,因为报告可以运行超过一天。
有没有办法用查询实现相同的功能,或者我应该使用一些存储过程和中间表?
答案 0 :(得分:1)
您应该将日期改为4小时:
凌晨3:59将成为晚上11:59。
select DATENAME(month, dateadd(hour, -4, sa.StartDate)) 'Month Name',
datename(dw, dateadd(hour, -4, sa.StartDate))'Day',
Convert(Varchar,CONVERT(date, dateadd(hour, -4, sa.StartDate)),103) 'Date',
CONVERT(DECIMAL(10,2), SUM(sa.OrigionalSubTotal) / 100.0) 'Gross Sales'
from Store st
inner join Sale sa on st.StoreID = sa.StoreID
where st.StoreID =xxxxxx
and sa.StartDate >= '2015-05-01 04:00:01' and sa.StartDate <= '2015-05-02 03:59:00'
group by st.StoreName, CONVERT(dateadd(hour, -4, sa.StartDate)), datename(dw,sa.StartDate),
DATENAME(month, dateadd(hour, -4, sa.StartDate))
order by Convert(Varchar,CONVERT(date, dateadd(hour, -4, sa.StartDate)),103)
您还应该使用ANSI语法进行连接。 From A, B Where
是旧语法。