SQL 按月分组求和,没有数据补0

效果图

先附上一张效果图,
前端选择
起止日期:DateStart,
截止日期:DateEnd月份
备件属性:SparePartAttributeIDSrch,
返回每月的求和数据,月份数据没有的补充0
表格:EasyUI datagrid,折线图:Echarts
在这里插入图片描述

主数据表

表名:UPMEquipConsume
备件属性:SparePartAttributeID
总价:Dmbtr
在这里插入图片描述

核心语句

select ROW_NUMBER() OVER (ORDER BY a.UseDate ASC) AS id,a.* 
from(
SELECT top 100 percent
 m AS 'UseDate',
 SUM ( CASE WHEN CONVERT ( VARCHAR ( 7 ), c.UseDate, 120 ) = m THEN c.Dmbtr ELSE 0 END ) AS 'bpbpxh' 
FROM
 ( SELECT '2020-12' m UNION ALL SELECT '2021-01' UNION ALL SELECT '2021-02' UNION ALL SELECT '2021-03' ) aa
 LEFT JOIN ( SELECT * FROM UPMEquipConsume WHERE SparePartAttributeID = 1 ) c ON CONVERT ( VARCHAR ( 7 ), c.UseDate, 120 ) = aa.m 
GROUP BY
 m 
ORDER BY m) a

筛选结果:

在这里插入图片描述

思路分析:

根据选择的起止月份,动态创建表m,然后左连接的主数据表UPMEquipConsume

SELECT '2020-12' m UNION ALL SELECT '2021-01' UNION ALL SELECT '2021-02' UNION ALL SELECT '2021-03' 

在这里插入图片描述

完整代码:

sqlZong:核心语句。
sqlZongNew:在核心语句的基础上加入分页功能。

            int page = PublicMethod.GetInt("page") == 0 ? 1 : PublicMethod.GetInt("page");
            int rows = PublicMethod.GetInt("rows") == 0 ? 10 : PublicMethod.GetInt("rows");
            int totalRead = (page - 1) * rows;



            string SparePartAttributeID = PublicMethod.GetString("SparePartAttributeIDSrch");
            DateTime DateStart = PublicMethod.GetDateTime("DateStart");
            DateTime DateEnd = PublicMethod.GetDateTime("DateEnd");


            string DateStartNew = DateStart.ToString("yyyy-MM");//2020-11
            //string DateStartNew = DateEnd.ToString("yyyy-MM");//2021-02

            string StartYear = DateStart.ToString("yyyy");//2020
            string StartMonth = DateStart.ToString("MM"); //11

            string EndYear = DateEnd.ToString("yyyy"); //2021
            string EndMonth = DateEnd.ToString("MM");  //02


            int sm = int.Parse(StartMonth);//11
            int em = int.Parse(EndMonth);//2


            string tempHead = "select ROW_NUMBER() OVER (ORDER BY a.UseDate ASC) AS id,a.* from( select top 100 percent m as 'UseDate', "
             + "SUM ( CASE WHEN CONVERT ( VARCHAR ( 7 ), c.UseDate, 120 ) = m THEN c.Dmbtr ELSE 0 END ) AS 'bpbpxh'  "
             + " from ( ";

            string tempsq = " select '" + DateStartNew + "' m";
            if (StartYear != EndYear) //跨年
            {
                int startyear = int.Parse(StartYear);
                int endyear = int.Parse(EndYear);

                //首年
                for (int i = sm + 1; i <= 12; i++)
                {

                    if (i < 10)
                        tempsq += " union all select '" + StartYear + "-0" + i + "'";
                    else
                        tempsq += " union all select '" + StartYear + "-" + i + "'";

                }
                //中间
                if (endyear - startyear > 1)
                {

                    for (int i = startyear + 1; i <= endyear - 1; i++)
                    {
                        for (int j = 1; j <= 12; j++)
                        {

                            if (j < 10)
                                tempsq += " union all select '" + i + "-0" + j + "'";
                            else
                                tempsq += " union all select '" + i + "-" + j + "'";

                        }
                    }

                }
                //尾年
                for (int i = 1; i <= em; i++)
                {
                    if (i < 10)
                        tempsq += " union all select '" + EndYear + "-0" + i + "'";
                    else
                        tempsq += " union all select '" + EndYear + "-" + i + "'";
                }
            }
            else //在同一年
            {

                for (int i = sm + 1; i <= em; i++)
                {
                    if (i < 10)
                        tempsq += " union all select '" + EndYear + "-0" + i + "'";
                    else
                        tempsq += " union all select '" + EndYear + "-" + i + "'";
                }

            }

            tempsq += ") aa ";

            string sqlZong = tempHead + tempsq
                  + " left join (SELECT * FROM UPMEquipConsume where SparePartAttributeID =" + SparePartAttributeID + ") c on CONVERT ( VARCHAR ( 7 ), c.UseDate, 120 ) = aa.m "
                  + " group by m ORDER BY m) a";

            string sqlZongNew = "SELECT TOP " + rows + " UseDate, bpbpxh from ("
                      + sqlZong + ")AA where ID not in ( select top " + totalRead + "id from("
                      + sqlZong + ")AA  ORDER BY UseDate ASC )   ORDER BY UseDate ASC";


            DataTable dt = CommAppKfzx.BLL.CommonToolBLL.SqlSelect(sqlZongNew);
            DataTable totalDT = CommAppKfzx.BLL.CommonToolBLL.SqlSelect(sqlZong);
            int totalInt = totalDT.Rows.Count;
            string jsonStr = JsonHelper.GetEasyUICombogridJsonByTable(dt, totalInt);
            context.Response.Write(jsonStr);

后续

前期也是查询了大量资料,相关文章都在这里,感谢以下博客大大提供的灵感,感谢,感谢,感谢!
SQL统计1-12月的数据,没有数据的月份显示为0
mysql 按月统计数据 没有数据按0补全
SQL统计1-12月的数据,没有数据的月份显示为0
mysql按日期分组(group by)查询统计的时候,没有数据补0的解决办法
MySQL之统计查询,按月查询每天数据,无数据自动填充0

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SQL Server中,可以使用GROUP BY子句对数据进行分组,并使用聚合函数如SUM()对每个组进行求和。下面是一个示例查询,演示如何使用GROUP BY和SUM()函数进行分组求和: SELECT DeptName, SUM(Salary) AS TotalSalary FROM DeptInfo GROUP BY DeptName; 这个查询将根据DeptName列对数据进行分组,并计算每个组的Salary总和。结果将包含每个部门的名称和对应的总薪水。 如果需要在结果中显示全部的合计和小计,可以使用WITH ROLLUP子句。下面是一个示例查询,演示如何使用WITH ROLLUP和CASE语句进行分组求和,并显示合计和小计: SELECT CASE WHEN GROUPING(DeptName) = 1 THEN '合计' ELSE DeptName END AS DeptName, SUM(Salary) AS TotalSalary FROM DeptInfo GROUP BY DeptName WITH ROLLUP; 这个查询将根据DeptName列对数据进行分组,并计算每个组的Salary总和。使用CASE语句在结果中显示'合计'或部门名称。WITH ROLLUP子句将在结果中添加合计行和小计行,以显示每个部门的总薪水和整个表的总薪水。 请注意,以上示例中的表和列名仅供参考,你需要根据实际情况进行调整。 #### 引用[.reference_title] - *1* [Server SQL 分组后 ,其他字段值相加(...for xml path)](https://blog.csdn.net/hamunet/article/details/110355567)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [SQLSERVER 使用 ROLLUP 汇总数据,实现分组统计,合计,小计](https://blog.csdn.net/qq_28256783/article/details/98616741)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值