ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > SQL in Excel > 双列显示查询结果

双列显示查询结果

作者:绿色风 分类: 时间:2022-08-17 浏览:180
楼主
嘉昆2011
素材来自:
条件查询双列有序提炼
http://www.exceltip.net/thread-49867-1-1.html


问题陈述:
如何根据查询条件,双列显示查询结果?

效果如下图所示:

 

SQL代码及思路:
  1. Transform Last(员工编号)
  2. Select Null From
  3. (Select
  4. 员工编号,
  5. DSum("1", "[名单$A:D]", "科室名称='ICU室' And 员工编号<="&员工编号) as 排序,
  6. Int((排序-1)/20)+1 as 列,
  7. ((排序-1) Mod 20)+1 as 行
  8. From [名单$A:D]
  9. Where 员工编号 IS NOT NULL And 科室名称="ICU室"
  10. Order by 员工编号
  11. Union All
  12. Select
  13. 姓名,
  14. DSum("1", "[名单$A:D]", "科室名称='ICU室' And 员工编号<="&员工编号) as 排序,
  15. Int((排序-1)/20)+1.00001 as 列,
  16. ((排序-1) Mod 20)+1 as 行
  17. From [名单$A:D]
  18. Where 员工编号 IS NOT NULL And 科室名称="ICU室"
  19. Order by 员工编号
  20. Union All
  21. Select
  22. Format(金额, "0.00") as 金额,
  23. DSum("1", "[名单$A:D]", "科室名称='ICU室' And 员工编号<="&员工编号) as 排序,
  24. Int((排序-1)/20)+1.01 as 列,
  25. ((排序-1) Mod 20)+1 as 行
  26. From [名单$A:D]
  27. Where 员工编号 IS NOT NULL And 科室名称="ICU室"
  28. Order by 员工编号)
  29. Group by 行
  30. Pivot 列
1,利用域聚合函数DSum记录符合条件的记录;
2,然后利用Int函数和Mod运算对记录分配“坐标”;
3,利用配权思想和联合查询将各字段信息组合起来;
4,交叉表查询输出模拟结果。

模拟效果:


 


附件:

举例.rar

2楼
LOGO
用SQL语句来处理感觉速度有点慢(可能是我机子的问题),且列标题的添加也是个问题。个人偏向于用VBA数组解决(已编辑采录一帖)
http://www.exceltip.net/thread-49888-1-1.html
  1. Sub human()
  2. Dim arr, 总数 As Integer, 行数, 列数, 目标数, 结果(), 标题, i As Integer, 结果行号
  3. Application.ScreenUpdating = False
  4. Application.Calculation = xlCalculationManual
  5. [I1].CurrentRegion.Clear
  6. With ActiveSheet
  7.     arr = Range("a1:d" & Cells(Rows.Count, 1).End(xlUp).Row)
  8. End With
  9. 总数 = WorksheetFunction.CountIf(Range("B1:B" & Cells(Rows.Count, 1).End(xlUp).Row), "ICU室")
  10. 行数 = 20                  '固定分成20行数据+1行标题
  11. 列数 = WorksheetFunction.RoundUp(总数 / 行数, 0) * 3 '目标数据总共有3列
  12. 标题 = Array("工资编号", "姓名", "金额")
  13. ReDim 结果(1 To 行数+1, 1 To 列数)
  14.                 For i = 1 To 列数
  15.                         结果(1, i) = 标题((i - 1) Mod 3)
  16.                 Next
  17.                 For i = 2 To UBound(arr)
  18.                     If arr(i, 2) = "ICU室" Then
  19.                             目标数 = 目标数 + 1
  20.                             结果行号 = (目标数 - 1) Mod 行数 + 2
  21.                             结果(结果行号, (WorksheetFunction.RoundUp(目标数 / 行数, 0) - 1) * 3 + 1) = arr(i, 1)
  22.                             结果(结果行号, (WorksheetFunction.RoundUp(目标数 / 行数, 0) - 1) * 3 + 2) = arr(i, 3)
  23.                             结果(结果行号, (WorksheetFunction.RoundUp(目标数 / 行数, 0) - 1) * 3 + 3) = Round(arr(i, 4), 2)
  24.                     End If
  25.                 Next
  26. [I1].Resize(行数+1, 列数) = 结果
  27. Application.ScreenUpdating = True
  28. Application.Calculation = xlCalculationAutomatic
  29. End Sub

3楼
嘉昆2011
SQL语句在这里确实有点慢,跑了2,3秒。另外就是所说的Pivot语句不能对其中字段重命名。
4楼
水星钓鱼
不错

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap