1

我有一个包含以下 2 列的表:日期和价格

我想根据同一年的同一个月计算价格。这就是我所拥有的:

2012-07-27 00:00:00.000 0
2012-07-27 00:00:00.000 15000
2012-08-27 00:00:00.000 0
2012-08-27 00:00:00.000 12000
2012-09-28 00:00:00.000 1000
2012-09-28 00:00:00.000 9000
2012-10-26 00:00:00.000 0

我想要以下内容:

2012-07-27 00:00:00.000 15000
2012-08-27 00:00:00.000 12000
2012-09-28 00:00:00.000 10000
2012-10-26 00:00:00.000 0

谢谢你。

4

3 回答 3

2

给定您的样本数据和输出,您可以获得所需的结果:

SELECT DATE, SUM(Price)
FROM YourTable
GROUP BY DATE
ORDER BY DATE

如果您在一个月中有多个日期并且想要返回每个不同的日期但仍显示您可以使用的每条记录的每月总和:

SELECT DATE, SUM(SUM(Price)) OVER (PARTITION BY YEAR(Date),MONTH(Date))
FROM YourTable
GROUP BY DATE
ORDER BY DATE
于 2013-08-12T18:15:04.883 回答
1

您需要使用 group by 语句中提供的日期函数,例如:

select sum(price)
       ,cast(datepart(month, date_column) as varchar) + '-' + cast(datepart(year, date_column) as varchar) as year_month
from your_table
group by datepart(year, date_column), datepart(month, date_column)

确保将 datepart(year, date_column) 放在首位,这样您就不会得到所有年份每年 1 月所有价格的总和,而是得到 2012 年 1 月以来所有价格的总和。

此查询的结果集看起来与您的示例略有不同 - 您会得到:

07-2012 15000
08-2012 12000
09-2012 10000
10-2012 0

如果您想获得您提供的确切结果集,您可以更改 select 语句的第一列:

select sum(price)
       ,date_column
from your_table
group by datepart(year, date_column), datepart(month, date_column)

这样做的缺点是,如果您在同一月份/年份中有多个日子,例如 2013 年 8 月 12 日和 2013 年 8 月 13 日,则很难预测您将在最终结果中获得哪两天放。

于 2013-08-12T18:07:50.043 回答
0

我同意 prekolna 的回答,这可能是你真正需要的。但是,要生成您在问题中的内容,您只需要按日期分组,因为月份中的日期都是相同的,并且您在退货中显示了日期:

SELECT
    [Date],
    SUM(Price) Price
FROM
    a_table
GROUP BY
    [Date];

以上假设您每个月只有一个唯一的日期条目,并且您希望返回完整的日期。诚然,这些都是错误的假设。我会稍微更改 prekolna 的示例,以确保日期列可以正确排序并通过以下方式在组中匹配它:

SELECT
    CAST(DATEPART(YEAR, [Date]) AS varchar(4)) + '-' + RIGHT('0' + CAST(DATEPART(MONTH, [Date]) AS varchar(2)), 2) YearMonth,
    SUM(Price) Price
FROM
    a_table
GROUP BY
    CAST(DATEPART(YEAR, [Date]) AS varchar(4)) + '-' + RIGHT('0' + CAST(DATEPART(MONTH, [Date]) AS varchar(2)), 2);

或者,您可以执行其他操作来返回完整日期,例如 MIN:

SELECT
    MIN([Date]) [Date],
    SUM(Price) Price
FROM
    a_table
GROUP BY
    CAST(DATEPART(YEAR, [Date]) AS varchar(4)),
    CAST(DATEPART(MONTH, [Date]) AS varchar(2));
于 2013-08-12T18:23:27.273 回答