C#高级:Lambda表达式分组处理2(WITH ROLLUP关键字)

目录

一、问题引入

二、with rollup查询

三、去掉多余数据

四、拓展


一、问题引入

查询SQL后结果如下,字段分别是用户、项目、批次、工作时间:

SELECT UserID,ProjectID,ProBatchesID,WorkHour 
FROM  MAINTABLE
GROUP BY
HourFiller
,ProjectID 
,ProBatchesID 

结果:

UserIDProjectIDProBatchesIDWorkHour
0400bb0e-a957-479e-98e0-60c4542eefa6E963F8E2-4713-4B7C-A154-CC4ED75A0CAA0C00F223-F9B7-4C23-A762-CC8A23D25F2C72
0400bb0e-a957-479e-98e0-60c4542eefa6E963F8E2-4713-4B7C-A154-CC4ED75A0CAA596BDF31-0038-4C36-AA95-B03F3D9C7B06224
052a3c6e-3a0e-44d2-8d5c-177760d03768E963F8E2-4713-4B7C-A154-CC4ED75A0CAA0C00F223-F9B7-4C23-A762-CC8A23D25F2C72
052a3c6e-3a0e-44d2-8d5c-177760d03768E963F8E2-4713-4B7C-A154-CC4ED75A0CAA596BDF31-0038-4C36-AA95-B03F3D9C7B06224
056f117a-163e-4cd9-acf1-362837c9904a53aa4cf1-99bf-46a0-acd6-11fc5b28e0761accce0a-1d4e-4e73-aa6f-9e2da0337f608
056f117a-163e-4cd9-acf1-362837c9904a53aa4cf1-99bf-46a0-acd6-11fc5b28e076f3f3e46b-8ca8-44cb-a4b5-5a8970f905ba2
056f117a-163e-4cd9-acf1-362837c9904a53aa4cf1-99bf-46a0-acd6-11fc5b28e076f719e55b-8142-43a7-a865-29e053d0566024
071632d3-65ae-4f13-b45d-e158e46bbf24E963F8E2-4713-4B7C-A154-CC4ED75A0CAA0C00F223-F9B7-4C23-A762-CC8A23D25F2C16
071632d3-65ae-4f13-b45d-e158e46bbf24E963F8E2-4713-4B7C-A154-CC4ED75A0CAA596BDF31-0038-4C36-AA95-B03F3D9C7B0648

我要的需求是:对每个人每个项目做一个WorkHour的合计,如何运用with rollup实现

二、with rollup查询

WITH TEMP AS(
    SELECT UserID,ProjectID,ProBatchesID,WorkHour FROM  MAINTABLE 
    GROUP BY
    HourFiller
    ,ProjectID 
    ,ProBatchesID 
    WITH ROLLUP
)
SELECT * FROM TEMP

结果:

UserIDProjectIDProBatchesIDWorkHour
0400bb0e-a957-479e-98e0-60c4542eefa6E963F8E2-4713-4B7C-A154-CC4ED75A0CAA0C00F223-F9B7-4C23-A762-CC8A23D25F2C72
0400bb0e-a957-479e-98e0-60c4542eefa6E963F8E2-4713-4B7C-A154-CC4ED75A0CAA596BDF31-0038-4C36-AA95-B03F3D9C7B06224
0400bb0e-a957-479e-98e0-60c4542eefa6E963F8E2-4713-4B7C-A154-CC4ED75A0CAANULL296
0400bb0e-a957-479e-98e0-60c4542eefa6NULLNULL296
052a3c6e-3a0e-44d2-8d5c-177760d03768E963F8E2-4713-4B7C-A154-CC4ED75A0CAA0C00F223-F9B7-4C23-A762-CC8A23D25F2C72
052a3c6e-3a0e-44d2-8d5c-177760d03768E963F8E2-4713-4B7C-A154-CC4ED75A0CAA596BDF31-0038-4C36-AA95-B03F3D9C7B06224
052a3c6e-3a0e-44d2-8d5c-177760d03768E963F8E2-4713-4B7C-A154-CC4ED75A0CAANULL296
052a3c6e-3a0e-44d2-8d5c-177760d03768NULLNULL296
056f117a-163e-4cd9-acf1-362837c9904a53aa4cf1-99bf-46a0-acd6-11fc5b28e0761accce0a-1d4e-4e73-aa6f-9e2da0337f608
056f117a-163e-4cd9-acf1-362837c9904a53aa4cf1-99bf-46a0-acd6-11fc5b28e076f3f3e46b-8ca8-44cb-a4b5-5a8970f905ba2
056f117a-163e-4cd9-acf1-362837c9904a53aa4cf1-99bf-46a0-acd6-11fc5b28e076f719e55b-8142-43a7-a865-29e053d0566024
056f117a-163e-4cd9-acf1-362837c9904a53aa4cf1-99bf-46a0-acd6-11fc5b28e076NULL34
056f117a-163e-4cd9-acf1-362837c9904aNULLNULL34
071632d3-65ae-4f13-b45d-e158e46bbf24E963F8E2-4713-4B7C-A154-CC4ED75A0CAA0C00F223-F9B7-4C23-A762-CC8A23D25F2C16
071632d3-65ae-4f13-b45d-e158e46bbf24E963F8E2-4713-4B7C-A154-CC4ED75A0CAA596BDF31-0038-4C36-AA95-B03F3D9C7B0648
071632d3-65ae-4f13-b45d-e158e46bbf24E963F8E2-4713-4B7C-A154-CC4ED75A0CAANULL64
071632d3-65ae-4f13-b45d-e158e46bbf24NULLNULL64

发现结果中不同人不同项目会自动分组合计,因此我们去掉多余的合计数据即可。

三、去掉多余数据

WITH TEMP AS(
    SELECT UserID,ProjectID,ProBatchesID,WorkHour FROM  MAINTABLE 
    GROUP BY
    HourFiller
    ,ProjectID 
    ,ProBatchesID 
    WITH ROLLUP
)
SELECT 
CASE WHEN ProBatchesID IS NULL THEN 'Total' ELSE UserID END AS UserID /*列出子数据和总合计*/
,CASE WHEN ProBatchesID IS NULL THEN 'Total' ELSE ProjectID END AS ProjectID
,CASE WHEN ProBatchesID IS NULL THEN 'Total' ELSE  ProBatchesID END AS ProBatchesID 
,WorkHour
FROM TEMP
WHERE ProjectID IS NOT NULL /*去掉多余的合计数据*/ 

结果:

UserIDProjectIDProBatchesIDWorkHour
0400bb0e-a957-479e-98e0-60c4542eefa6E963F8E2-4713-4B7C-A154-CC4ED75A0CAA0C00F223-F9B7-4C23-A762-CC8A23D25F2C72
0400bb0e-a957-479e-98e0-60c4542eefa6E963F8E2-4713-4B7C-A154-CC4ED75A0CAA596BDF31-0038-4C36-AA95-B03F3D9C7B06224
TotalTotalTotal296
052a3c6e-3a0e-44d2-8d5c-177760d03768E963F8E2-4713-4B7C-A154-CC4ED75A0CAA0C00F223-F9B7-4C23-A762-CC8A23D25F2C72
052a3c6e-3a0e-44d2-8d5c-177760d03768E963F8E2-4713-4B7C-A154-CC4ED75A0CAA596BDF31-0038-4C36-AA95-B03F3D9C7B06224
TotalTotalTotal296
056f117a-163e-4cd9-acf1-362837c9904a53aa4cf1-99bf-46a0-acd6-11fc5b28e0761accce0a-1d4e-4e73-aa6f-9e2da0337f608
056f117a-163e-4cd9-acf1-362837c9904a53aa4cf1-99bf-46a0-acd6-11fc5b28e076f3f3e46b-8ca8-44cb-a4b5-5a8970f905ba2
056f117a-163e-4cd9-acf1-362837c9904a53aa4cf1-99bf-46a0-acd6-11fc5b28e076f719e55b-8142-43a7-a865-29e053d0566024
TotalTotalTotal34
071632d3-65ae-4f13-b45d-e158e46bbf24E963F8E2-4713-4B7C-A154-CC4ED75A0CAA0C00F223-F9B7-4C23-A762-CC8A23D25F2C16
071632d3-65ae-4f13-b45d-e158e46bbf24E963F8E2-4713-4B7C-A154-CC4ED75A0CAA596BDF31-0038-4C36-AA95-B03F3D9C7B0648
TotalTotalTotal64

四、拓展

 【拓展】如果题目改为:
对每个项目做一个WorkHour的合计,如何运用with rollup实现
①调整groupby顺序(调整后:)

    GROUP BY
     ProjectID 
    ,HourFiller
    ,ProBatchesID 

②调整case when的判空条件(查表后具体问题具体分析)
③调整筛选范围(查表后具体问题具体分析)

【注意】
以下这种情况,虽然数据都被覆盖为Total,但是实际的值还是null,023d991d-e3cb-412b-9226-ec7fca86833c,null,换句话说,SELECT * FROM TABLE WHERE UserID IS NULL 能筛选出最后一条数据

  • 18
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Lambda表达式是C++11引入的一种函数对象,可以在需要函数对象的地方使用,比如作为函数参数、返回值等。Lambda表达式的语法形式如下: ``` [capture list](parameters) mutable exception -> return type { // function body } ``` 其中,`capture list` 表示捕获列表,用于捕获外部变量。`parameters` 表示函数参数列表,`mutable` 用于表示是否可以修改值传递的变量,`exception` 是异常列表,`return type` 表示返回类型,`function body` 则是函数体。 在Lambda表达式中,可以通过 `[this]` 捕获当前对象的指针,即 `this` 指针,可以方便地访问当前对象的成员变量和成员函数。例如: ``` class MyClass { public: void foo() { int x = 1; auto lambda = [this, x]() mutable { this->m_member_var += x; this->m_member_function(); x++; }; lambda(); } private: int m_member_var; void m_member_function(); }; ``` 在上面的例子中,Lambda表达式通过 `[this, x]` 捕获了当前对象的指针和 `foo()` 函数中定义的变量 `x`。在 Lambda 表达式中可以通过 `this->m_member_var` 和 `this->m_member_function()` 访问当前对象的成员变量和成员函数。由于 `x` 是值传递的,所以在 Lambda 表达式中需要使用 `mutable` 关键字使其可修改,可以通过 `x++` 修改变量的值。最后调用 `lambda()` 执行 Lambda 表达式。 需要注意的是,Lambda表达式捕获 `this` 指针时,需要保证当前对象是有效的,即不能在已经销毁的对象中访问成员变量和成员函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值