【问题标题】:How to Group by month when there's a turn of the month当有月份时如何按月分组
【发布时间】:2019-11-21 22:56:24
【问题描述】:

我有一张带有此模板的表格:

表_1

+----------+------------------+-----+
| Code     |     DateTime     | Qty |
+----------+------------------+-----+
|        1 |08/31/2019 18:30  | 100 |
|        1 |09/01/2019 18:30  | 150 |
|        2 |09/03/2019 18:30  |  80 |
|        2 |09/03/2019 18:30  | 100 |
|        3 |10/15/2019 18:30  | 100 |
+----------+------------------+-----+

我需要按代码、年份、月份和总和(数量)分组。

我已经选择了这张桌子:

Select
    Year(DateTime) as Year,
    DATENAME(Month,Datetime) as Month,
    CODE,
    SUM(QTY) as Qty,

From 
    Table_1

Group by 
    Code,
    Year(DateTime),
    DATENAME(Month,Datetime)

Order by Code

但是当代码在两个不同的月份中有日期时间时,该代码有两行:

+----+-----------+-=---+-----+
|Year|   Month   |Code | Qty |
+----+-----------+-----+-----+
|2019| August    |  1  | 100 |
|2019| September |  1  | 150 |
|2019| September |  2  | 180 |
|2019| October   |  3  | 100 |
+----+-----------+-----+-----+

如何按代码分组,在这种情况下,行数超过一个月, 考虑过去一个月,例如:

+----+-----------+-=---+-----+
|Year|   Month   |Code | Qty |
+----+-----------+-----+-----+
|2019| September |  1  | 250 |
|2019| September |  2  | 180 |
|2019| October   |  3  | 100 |
+----+-----------+-----+-----+

希望我是清楚的。

【问题讨论】:

  • 看起来你想使用 MAX 月份而不是按它分组。
  • “但是当代码在两个不同的月份中有日期时间时,该代码有两行”,但这是有道理的。 9 月代码 1SUM 150,而不是 250..
  • @SeanLange 但是月份不是按字母顺序排列的
  • DATENAME(MONTH,MAX(Yourdate)) 是@JoelCoehoorn ;)
  • @JoelCoehoorn 我意识到这一点。看起来他们想要最近一个月。

标签: sql sql-server


【解决方案1】:

仅按代码分组。这里的诀窍是在之后显示正确的月份和日期。最简单的方法是通过嵌套查询:

SELECT 
    YEAR(Month) As Year, 
    DATENAME(Month, Month) AS Month, 
    Code, 
    Qty
FROM (
    SELECT
        CODE, 
        MAX([Datetime]) As Month,
        SUM(QTY) as Qty
    FROM
        Table_1    
    GROUP BY 
        Code 
) t    
ORDER BY Code

如果你也只想要那个月的数量,这会有点困难,但由于你仍然SUM()所有月份,我们仍然可以通过简单的聚合来解决。

【讨论】:

  • DATENAME(Month, Month) AS Month >_
【解决方案2】:

你可以试试下面的脚本-

SELECT YEAR(A.MX_MONTH) Yr,
DATENAME(Month,A.MX_MONTH) Mn,
A.Code Code,
SUM(A.Qty) Qty  
FROM(
    SELECT *,MAX(DateTime) OVER(PARTITION BY Code) MX_MONTH
    FROM your_table
)A
GROUP BY A.Code,YEAR(A.MX_MONTH),DATENAME(Month,A.MX_MONTH)

输出是-

Yr      Mn          Code    Qty
2019    September   1       250
2019    September   2       180
2019    October     3       100

您可以查看DEMO HERE

【讨论】:

    猜你喜欢
    • 2017-10-29
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    • 2018-02-11
    • 2016-11-28
    • 1970-01-01
    相关资源
    最近更新 更多