【问题标题】:Need help to make a query需要帮助进行查询
【发布时间】:2013-04-11 19:26:06
【问题描述】:

下面的查询返回两列 - dateOfBusiness,一个 datetimesalesOnDate,一个 int。这是具有区号 storeId 的一家商店每天产生的销售额。结果集由 500-600 行组成。

我想得到一个月的平均销售额,即 salesOnDate 的平均值。我想使用子查询as shown in this SO question。但这对我不起作用。我该怎么做?

select count(salesOnDate)
from dbo.localSales
where productName like '%juice%'
and storeId = 'MUN123'
group by dateOfBusiness

我试着这样做,但它不起作用 -

select sum(x.count)
from
(
  select  count(id) as 'count'
  from    table   
) x

其他信息 -

表结构-

dateOfBusiness | salesOnDate
-------------------------------
2013-10-5   | 200
2013-10-6   | 100
2013-10-7   | 700    

我想对任意时间段的 salesOnDate 求和,比如一个月。

【问题讨论】:

  • 您能否展示一些示例数据和您的预期结果?
  • @EricZ - 添加示例数据

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


【解决方案1】:

这将为您提供每月的平均销售额以及该月的总销售额:

-- can use DATEPART instead of DATENAME if you prefer numbered months (i.e., 1 = January, 2 = February, etc.)
SELECT DATENAME(month, dateOfBusiness) [Month], SUM(salesOnDate) [TotalSales], AVG(salesOnDate) [AverageSales]
FROM dbo.localSales
WHERE productName like '%juice%'
AND storeId = 'MUN123'
GROUP BY DATENAME(month, dateOfBusiness)

查询的重要部分是DATENAME(或DATEPART,如果您使用它)函数,它只会从您的日期列中获取特定信息,而不是整个值。

例如,假设您有 2013 年 4 月 11 日的三条记录

   dateOfBusiness     salesOnDate
--------------------- -----------
2013-04-11 08:03:24       5
2013-04-11 11:45:17       1
2013-04-11 20:23:52       3

使用上面的查询将显示它们分为一个月:

     Month          TotalSales      AverageSales
----------------- --------------  ----------------
     April               9               3

【讨论】:

  • 请查看已编辑的问题。我想改用子查询来编写代码。
【解决方案2】:

您确定不要sum(salesOnDate) 而不是count(salesOnDate)? Count 返回行数,sum 将返回所有行值的总和。 平均函数是AVG,所以你可以说:

    select 
           dateOfBusiness,storeId , 
           count(salesOnDate), sum(salesOnDate), avg(salesOnDate)
    from 
           dbo.localSales
    where 
          productName like '%juice%'
          and storeId = 'MUN123'
    group by 
          dateOfBusiness,storeId 

好的,鉴于您对问题的修改,请尝试:

select 
  storeId , dob_yr, dob_mo, count(salesOnDate), sum(salesOnDate), avg(salesOnDate)
from (
        select 
               dateOfBusiness,storeId , year(dateOfBusiness) as dob_yr, 
               month(dateOfBusiness) as dob_mo,
               salesOnDate
        from 
               dbo.localSales
        where 
              productName like '%juice%'
              and storeId = 'MUN123'
) t
group by
  storeId , dob_yr, dob_mo

【讨论】:

  • 贝丝,其实我想用子查询来做。我想学习在这种情况下如何使用子查询。