如何在 group by 中使用 case 表达式和 min()
Posted
技术标签:
【中文标题】如何在 group by 中使用 case 表达式和 min()【英文标题】:How to use case expression and min() with group by 【发布时间】:2021-01-21 03:49:59 【问题描述】:我执行时的以下查询
SELECT St.FirstName,St.LastName,
CASE
WHEN St.ISPackage='N' THEN Min(St.VisitingDate)
WHEN St.ISPackage='Y' THEN St.VisitingDate
END AS VisitingDate
FROM SalesTransaction As St
(...inner join and where clause)
GROUP BY St.FirstName,St.LastName, St.VisitingDate
如果我在 Group By
中使用 St.VisitingDate,结果会重复。
如果Group By
中未使用 St.VisitingDate 则显示错误
在选择列表中无效,因为它不包含在任一聚合函数中
我该如何解决这个问题?
【问题讨论】:
您不能同时拥有 St.VisitingDate 和 Min(St.VisitingDate)。 GROUP BY 问题,而不是 case 表达式问题。 也许您实际上想要一个窗口化的MIN
而没有GROUP BY
?示例数据和预期结果将帮助我们为您提供帮助。
请提供样本数据和期望的结果。
嗨,斯里。查看您的个人资料,我可以看到您过去曾问过许多问题并收到了几个答案。显然,它们中没有一个对你来说足够好,这似乎很了不起。您可能必须提出更清晰的问题才能获得令人满意的答案。或者你可能根本不知道这个概念:***.com/help/someone-answers
嗨@MatBailie 请小心。由于缺乏礼仪而移除 13 cmets 可能不是您想要实现的目标。也许你可以找到一个更好的例子来说明你的观点。也许在不远的地方......
【参考方案1】:
我怀疑当ISPackage
为“Y”时,您想按名称分组并获取访问日期,如果没有ISPackage
所在的日期,则回退到最早的访问日期“是”。
如果是这样,你可以这样做:
SELECT St.FirstName,St.LastName,
COALESCE(MIN(CASE WHEN St.ISPackage = 'Y' THEN St.VisitingDate END), MIN(St.VisitingDate)) VisitingDate
FROM SalesTransaction As St
-- (...inner join and where clause)
GROUP BY St.FirstName,St.LastName
【讨论】:
谢谢,请为以下查询提供解决方案 CASE WHEN St.ISPackage='N' THEN Min(St.VisitingDate) WHEN St.ISPackage='Y' THEN St.VisitingDate END AS VisitingDate跨度> 【参考方案2】:你可以使用下面的 SQL- 我使用子查询计算了最小日期。
SELECT St.FirstName,St.LastName,
CASE
WHEN St.ISPackage='Y' THEN St.VisitingDate
ELSE min_dt.min_VisitingDate
END AS VisitingDate
FROM
SalesTransaction As St
(...inner join and where clause)
left join (select St.FirstName,St.LastName, min(St.VisitingDate) min_VisitingDate from SalesTransaction group by St.FirstName,St.LastName) min_dt
ON St.FirstName =min_dt.FirstName ,St.LastName =min_dt.LastName
【讨论】:
以上是关于如何在 group by 中使用 case 表达式和 min()的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Oracle 中编写长 group by/case 子句?
在 MySQL 中使用 Case 加入 Group By & Order