如何使用 select 语句中的函数按日期的月份分组

How to group by month of a date using a function in a select statement

我在使用函数时按日期的月份分组时遇到问题。它以前是有效的,但查询不那么复杂,因为我现在使用的函数使用当前月份的滚动年份。这是我的代码。

SELECT
    CASE 
WHEN DATEDIFF(mm,dbo.fn_firstofmonth(getdate()), dbo.fn_firstofmonth(D.expected_date)) < 12
THEN DATEDIFF(mm,dbo.fn_firstofmonth(getdate()), dbo.fn_firstofmonth(D.expected_date)) + 1
ELSE 13 END AS [Expected Month],
    P.probability AS [Category], COUNT(O.id) AS [Customers]
FROM opportunity_probability P
INNER JOIN opportunity_detail D ON D.probability_id = P.id
INNER JOIN opportunities O ON D.opportunity_id = O.id
INNER JOIN
(
    SELECT opportunity_id
    FROM opportunity_detail
    GROUP BY opportunity_id
) T ON T.opportunity_id = O.customer_id
GROUP BY P.probability, MONTH(D.expected_date)
ORDER BY  P.probability, MONTH(D.expected_date)

如果我在 GROUP BY 中有 D.expected_date,它会起作用,但我需要在此日期的 MONTH 进行分组,因为它不能正确地传递数据。

您可以尝试通过以下代码查找月份:

GROUP BY P.probability, DATEPART(month, D.expected_date)

试试这个

SELECT
to_char(D.expected_date, 'YYYY-MM'),
    CASE 
WHEN DATEDIFF(mm,dbo.fn_firstofmonth(getdate()), dbo.fn_firstofmonth(D.expected_date)) < 12
THEN DATEDIFF(mm,dbo.fn_firstofmonth(getdate()), dbo.fn_firstofmonth(D.expected_date)) + 1
ELSE 13 END AS [Expected Month],
    P.probability AS [Category], COUNT(O.id) AS [Customers]
FROM opportunity_probability P
INNER JOIN opportunity_detail D ON D.probability_id = P.id
INNER JOIN opportunities O ON D.opportunity_id = O.id
INNER JOIN
(
    SELECT opportunity_id
    FROM opportunity_detail
    GROUP BY opportunity_id
) T ON T.opportunity_id = O.customer_id
GROUP BY P.probability, to_char(D.expected_date, 'YYYY-MM')
ORDER BY  P.probability, to_char(D.expected_date, 'YYYY-MM')

您可以随时删除分组依据,然后将整个 select 放入另一个 select,然后按外部 select:

分组
select t.A, t.B from (select A, datepart(month, b) as B) t group by t.A, t.B

这样您就可以像处理普通字段一样处理您的月份字段。

示例还远未完成,但应该可以帮助您上手。