Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何计算SQL字段在一个范围内的结果数?_Sql_Count_Sum - Fatal编程技术网

如何计算SQL字段在一个范围内的结果数?

如何计算SQL字段在一个范围内的结果数?,sql,count,sum,Sql,Count,Sum,我有一张表格,上面列出了发票描述、金额以及发票过期的天数。(例如,负数表示尚未到期;-4表示4天后到期) 我想计算逾期50天以上、40-49天和30-39天的项目数量,然后显示所选项目的金额总和 我的结果可能是什么样子的示例: +--------------+--------------+--------------+ | OverdueRange | OverdueCount | Total Amount | +--------------+--------------+-----------

我有一张表格,上面列出了发票描述、金额以及发票过期的天数。(例如,负数表示尚未到期;-4表示4天后到期)

我想计算逾期50天以上、40-49天和30-39天的项目数量,然后显示所选项目的金额总和

我的结果可能是什么样子的示例:

+--------------+--------------+--------------+
| 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