【问题标题】:SQL query for total sales by each department for each day not workingSQL查询每个部门每天的总销售额不工作
【发布时间】:2016-12-05 20:12:22
【问题描述】:

希望这很简单。我要查找的是每天按部门划分的总销售额。有多个部门,在多个日期的多个商店中。

我得到的是部门中每个销售的一行。我认为这是因为 SQL 正在执行它所告诉的操作,并且由于交易时间的原因,每次销售都向我显示一行。我每天都在尝试分组,我确信我错过了一些简单的东西。

这是一个示例表

SalesTotal | Department | StoreNumber | SalesDateTime 
---------- | ---------- | ----------- | ------------------- 
3.96         Books        5000         2016-10-01 10:01:11    
0.99         Books        5000         2016-10-01 10:03:40    
3.98         Books        5000         2016-10-01 10:19:45    
0.99         Books        5000         2016-10-01 10:27:58    
2.98         Women        5000         2016-10-01 11:50:11    
1.49         Women        5000         2016-10-01 11:58:35    
2.97         Women        5000         2016-10-01 12:05:11    
4.15         Women        5000         2016-10-01 12:06:20    
3.98         Mens         5000         2016-10-01 12:55:03    
4.98         Mens         5000         2016-10-01 13:02:13    
4.47         Mens         5000         2016-10-01 13:19:40    

我期待的是这个

SalesTotal | Department | StoreNumber | SalesDateTime 
---------- | ---------- | ----------- | ------------------- 
9.93         Books        5000         2016-10-01 
11.58        Womens       5000         2016-10-01
13.43        Mens         5000         2016-10-01 

我认为这只是一个 SUM 和分组查询,但我无法让它以这种方式出现。我正在从表中获取数据并将其放入临时表中,因为我有其他表中的其他数据(如商店名称等),但上面的值是准确的。下面是查询(是的,我有几个变量,但仅用于在前端选择日期)...

SELECT SUM(Price) AS SalesTotal
    , Department
    , StoreNumber
    , SaleDateTime
INTO #tblSales
FROM LineItem
WHERE SaleDateTime  BETWEEN @StartDate AND @EndDate
GROUP BY  Department,  T.StoreNumber, SaleDateTime

SELECT *
FROM #tblSales

感谢您查看,如果需要更多信息,请告诉我。如前所述,我似乎无法弄清楚我在分组部分中缺少什么。我很感激能得到任何帮助。

【问题讨论】:

    标签: sql sql-server-2012


    【解决方案1】:

    您按日期时间分组,这意味着如果它们不相同,则不会被分组。要仅基于日期进行分组,您必须将 TransactionDateTime 转换为 Date,然后对其进行选择/分组。

    SELECT SUM(Price) AS SalesTotal
        , Department
        , StoreNumber
        , CONVERT(date, SaleDateTime) As SaleDate
    INTO #tblSales
    FROM LineItem
    WHERE SaleDateTime  BETWEEN @StartDate AND @EndDate
    GROUP BY  Department,  T.StoreNumber, CONVERT(date, SaleDateTime)
    
    SELECT *
    FROM #tblSales
    

    您提供的信息略有冲突,因为您的查询使用了一个名为SaleDateTime 的字段,而您的示例表使用了TransactionDateTime。上面的例子使用了SaleDateTime

    【讨论】:

    • ....它正盯着我的脸。我现在完全明白了。谢谢您的意见。已标记答案。如果你不介意好奇的问题。我更改了查询以在 SELECT FROM the temp table 期间进行求和和转换。如果我使用 SELECT INTO 进行转换和求和,性能会更好吗?
    • 说实话,我没有给你很好的答案。老实说,我只想对两者进行比较,看看哪个可以让您获得更快的返回速度!祝你好运。
    • 使用 SELECT INTO 会快 4 秒。
    • 就像我说的...SELECT INTO 肯定更快;)哈哈。很高兴知道,感谢您的反馈!
    【解决方案2】:

    那是因为您也在使用日期中的时间进行分组,并且它们不同,所以除非行中的确切时间相同,否则它将无法按照您的需要进行分组。试试这个:

    select sum(Price) as SalesTotal,
        Department,
        StoreNumber,
        min(convert(varchar, SaleDateTime, 102)) as SaleDateTime
    from LineItem
    where SaleDateTime between @StartDate and @EndDate
    group by Department,
        T.StoreNumber,
        year(SaleDateTime),
        datepart(dy, SaleDateTime)
    

    【讨论】:

    • 感谢阿南德的帮助!!
    • 不客气,我们将不胜感激:)
    【解决方案3】:

    您的查询似乎没问题,问题出在查询的变量/列名上,因为我在您发布数据时对您的问题进行了微小更改并且工作正常,我执行的查询与(修改)一样您提供的数据

    SELECT SUM(SalesTotal), Department, StoreNumber
    FROM Test
    Where TransactionDateTime = '2016-10-01 10:01:00.000'
    GROUP BY  Department,  StoreNumber, TransactionDateTime
    

    如果问题仍然存在,请在此处粘贴您的错误/结果

    【讨论】:

      猜你喜欢
      • 2018-08-12
      • 2016-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-06
      • 2022-12-18
      • 1970-01-01
      相关资源
      最近更新 更多