如何计算SQL字段在一个范围内的结果数?
我有一张表格,上面列出了发票描述、金额以及发票过期的天数。(例如,负数表示尚未到期;-4表示4天后到期) 我想计算逾期50天以上、40-49天和30-39天的项目数量,然后显示所选项目的金额总和 我的结果可能是什么样子的示例:如何计算SQL字段在一个范围内的结果数?,sql,count,sum,Sql,Count,Sum,我有一张表格,上面列出了发票描述、金额以及发票过期的天数。(例如,负数表示尚未到期;-4表示4天后到期) 我想计算逾期50天以上、40-49天和30-39天的项目数量,然后显示所选项目的金额总和 我的结果可能是什么样子的示例: +--------------+--------------+--------------+ | OverdueRange | OverdueCount | Total Amount | +--------------+--------------+-----------
+--------------+--------------+--------------+
| OverdueRange | OverdueCount | Total Amount |
+--------------+--------------+--------------+
| 50+ | 12 | 10220 |
| 49-49 | 13 | 494 |
| 30-39 | 25 | -403 |
+--------------+--------------+--------------+
如何实现这一点?您可以使用CASE子句实现这一点:
SELECT CASE WHEN OverdueBy >= 50 THEN '50+'
WHEN OverdueBy >= 40 and OverdueBy < 50 THEN '40-49'
WHEN OverdueBy >= 30 and OverdueBy < 40 THEN '30-39'
.....
ELSE 'Less than that' END AS OverdueRange,
Count(*) as OverdueCount,
Sum(Amount) as [Total Amount]
From yourtable
group by CASE WHEN OverdueBy >= 50 THEN '50+'
WHEN OverdueBy >= 40 and OverdueBy < 50 THEN '40-49'
WHEN OverdueBy >= 30 and OverdueBy < 40 THEN '30-39'
.....
ELSE 'Less than that' END
选择OverdueBy>=50时的大小写,然后选择“50+”
当OverdueBy>=40且OverdueBy<50时,则为“40-49”
当OverdueBy>=30且OverdueBy<40时,则为“30-39”
.....
否则“比那少”的结果就是过度,
将(*)计数为过量计数,
总额(金额)为[总金额]
从你的桌子上
当过量>=50时按情况分组,然后为“50+”
当OverdueBy>=40且OverdueBy<50时,则为“40-49”
当OverdueBy>=30且OverdueBy<40时,则为“30-39”
.....
否则“比那少”了
内部查询创建一个“OverdueByRange”列,外部查询随后根据该列进行分组,以获得总和和计数
SELECT
OverdueRange,
COUNT(*) OverdueCount,
SUM(AMOUNT) TotalAmount
FROM (
SELECT
Amount,
(CASE
WHEN OverdueBy >= 50
THEN '50+'
WHEN OverdueBy BETWEEN 40 AND 49
THEN '40-49'
WHEN OverdueBy BETWEEN 30 AND 39
THEN '30-39'
ELSE 'Other'
END) OverdueRange
FROM invoices
WHERE OverdueBy >= 30) t1
GROUP BY OverdueRange
当然,该表应该存储DueDate并计算某个时间点的DaysOverdue…不清楚您的过期范围包括哪些。50+是否包括368和所有负片,40-49和30-39无?然而,我从您的示例输出中看到情况并非如此。@MitchWheat是的,它确实包括DueDate,这是我用来计算逾期天数的。为了使我的帖子简单化,我排除了不相关的字段
SELECT
OverdueRange,
COUNT(*) OverdueCount,
SUM(AMOUNT) TotalAmount
FROM (
SELECT
Amount,
(CASE
WHEN OverdueBy >= 50
THEN '50+'
WHEN OverdueBy BETWEEN 40 AND 49
THEN '40-49'
WHEN OverdueBy BETWEEN 30 AND 39
THEN '30-39'
ELSE 'Other'
END) OverdueRange
FROM invoices
WHERE OverdueBy >= 30) t1
GROUP BY OverdueRange