在SQL Server中的dailysales报告中分组,输出错误

时间:2015-08-24 07:10:53

标签: sql sql-server sql-server-2008

我必须为我的餐厅生成每日销售报告。 餐厅将于凌晨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()函数来获取日期名称和日期,因为报告可以运行超过一天。

有没有办法用查询实现相同的功能,或者我应该使用一些存储过程和中间表?

1 个答案:

答案 0 :(得分:1)

您应该将日期改为4小时:

  • 凌晨4:00将成为00:00 AM
  • 凌晨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是旧语法。