如何写sql语句完成如下的统计查询功能?

发布于 2022-09-04 04:59:11 字数 1819 浏览 10 评论 0

描述:java ssh 生成报表!

数据库表的结构如下:

clipboard.png

要获得的数据报表如下:

clipboard.png

要求:

  1. 默认查询所有

  2. 可以选择条件,部门,时间范围,状态,类别,姓名,一个条件或者多个

  3. 当有类别,状态条件时,比如查询A类的,那么B,C两类都显示为零。

附上我自己的实现:(没有加ID字段)

  select t4.name name,
  nvl((select count(*) from apply_info t1 
   where (t1.curr_status='1') and t1.category='A'
    and t1.Name=t4.Name  group by Name),0)
   as A1,
   nvl((select count(*) from apply_info t2 
   where (t1.curr_status='2') and t2.category='A'
    and t2.Name=t4.Name  group by Name),0)
   as A2,
   nvl((select count(*) from apply_info t1 
   where (t1.curr_status='1') and t1.category='B'
    and t1.Name=t4.Name  group by Name),0)
   as B1,
   nvl((select count(*) from apply_info t2 
   where (t1.curr_status='2') and t2.category='B'
    and t2.Name=t4.Name  group by Name),0)
   as B2,
   nvl((select count(*) from apply_info t1 
   where (t1.curr_status='1') and t1.category='C'
    and t1.Name=t4.Name  group by Name),0)
   as C1,
   nvl((select count(*) from apply_info t2 
   where (t1.curr_status='2') and t2.category='C'
    and t2.Name=t4.Name  group by Name),0)
   as C2 
   from  apply_info t4 where 1=1
    group by Name;
  • 各个统计和是我查询以后另外计算的,不是直接查询出来的,因为觉得加上查询和这些语句又会长很多。

  • 到这里我就觉得查询语句太复杂了,写这么长而且大量的重复。

  • 并且如果加上查询条件,又会涉及很复杂的拼接操作,比如当我查询某一部门,需要在最后的t4以及统计子查询加上条件;选择时间范围条件就只需要在每个统计子查询加上条件(类别,状态,也是如此);还有各种条件的组合。


所以有没有什么好的解决方案,更好的sql设计不要那么长,在动态的条件选择下有没有好的字符串的操作方案?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

只等公子 2022-09-11 04:59:11

这个问题的复杂性主要来自于混淆了查询结果的内容和呈现形式。从查询结果的内容看,其实就是count(*) group by 姓名, 类别, 状态。但是在呈现形式上需要最后把类别横向展示。

呈现形式并非SQL长项。用SQL解决呈现形式问题往往导致复杂、不自然的语句。建议用其它工具展示。

音盲 2022-09-11 04:59:11
select name,
       sum(decode(category, 'A', decode(curr_status, 1, 1, 0), 0)) as A_1,
       sum(decode(category, 'A', decode(curr_status, 2, 1, 0), 0)) as A_2,
       sum(decode(category, 'B', decode(curr_status, 1, 1, 0), 0)) as B_1,
       sum(decode(category, 'B', decode(curr_status, 2, 1, 0), 0)) as B_2,
       sum(decode(category, 'C', decode(curr_status, 1, 1, 0), 0)) as C_1,
       sum(decode(category, 'C', decode(curr_status, 2, 1, 0), 0)) as C_2
from apply_info 
where dept_name = ?
  and curr_status = ?
  and category = ?
  and apply_date between ? and ?
group by name
月亮是我掰弯的 2022-09-11 04:59:11

百度sql交叉表,只是这种查询方式效率很差,如果数据量大,还不如前台重组数据

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文