sql - 如何将这些查询组合成一个查询?还是一个 pl/sql 存储过程?
问题描述
我想用 jaspersoft studio 和 oracle pl/sql 数据源构建一个报告,所以我想结合这些查询来编写程序。我正在尝试制作与此类似的报告。 在此处输入图像描述
第一个查询:在图像中显示 X 1。
SELECT SUM(BD.QUANTITY)
FROM BRANCHS_MOVE_DTLS BD,BRANCHS_MOVES BM
WHERE BD.BRNCHMOVE_ID = BM.ID
AND BD.BRNCHMOVE_CURR_ID = BM.CURR_ID
AND BD.CLNT_TYPE_ID IN ( 3,4 )
AND BD.SUPPLIER_ID = 1
AND BD.PTITMMOVTP_ID = 2
AND BM.MONTH = &b3
AND BM.MOVE_TYPE = 2
AND BD.PITMMVDLTP_ID = 2
2- 在图像中显示 X 2。
SELECT SUM(BD.QUANTITY)
FROM BRANCHS_MOVE_DTLS BD,BRANCHS_MOVES BM
WHERE BD.BRNCHMOVE_ID = BM.ID
AND BD.BRNCHMOVE_CURR_ID = BM.CURR_ID
AND BD.CLNT_TYPE_ID IN ( 3,4 )
AND BD.SUPPLIER_ID = 2
AND BD.PTITMMOVTP_ID = 2
AND BM.MONTH = &b3
AND BM.MOVE_TYPE = 2
AND BD.PITMMVDLTP_ID = 2
3- 显示 Y 1
SELECT SUM(BD.QUANTITY)
FROM BRANCHS_MOVE_DTLS BD,BRANCHS_MOVES BM
WHERE BD.BRNCHMOVE_ID = BM.ID
AND BD.BRNCHMOVE_CURR_ID = BM.CURR_ID
AND BD.CLNT_TYPE_ID = 2
AND BD.SUPPLIER_ID = 1
AND BD.PTITMMOVTP_ID = 2
AND BM.MONTH = &b3
AND BM.MOVE_TYPE = 2
AND BD.PITMMVDLTP_ID = 2
4- 显示 Y 2
SELECT SUM(BD.QUANTITY)
FROM BRANCHS_MOVE_DTLS BD,BRANCHS_MOVES BM
WHERE BD.BRNCHMOVE_ID = BM.ID
AND BD.BRNCHMOVE_CURR_ID = BM.CURR_ID
AND BD.CLNT_TYPE_ID = 2
AND BD.SUPPLIER_ID = 2
AND BD.PTITMMOVTP_ID = 2
AND BM.MONTH = &b3
AND BM.MOVE_TYPE = 2
AND BD.PITMMVDLTP_ID = 2
5-显示 Z 1
SELECT SUM(BD.QUANTITY)
FROM BRANCHS_MOVE_DTLS BD,BRANCHS_MOVES BM
WHERE BD.BRNCHMOVE_ID = BM.ID
AND BD.BRNCHMOVE_CURR_ID = BM.CURR_ID
AND BD.CLNT_TYPE_ID = 11
AND BD.SUPPLIER_ID = 1
AND BD.PTITMMOVTP_ID = 2
AND BM.MONTH = &b3
AND BM.MOVE_TYPE = 2
AND BD.PITMMVDLTP_ID = 2
6- 显示 Z 2
SELECT SUM(BD.QUANTITY)
FROM BRANCHS_MOVE_DTLS BD,BRANCHS_MOVES BM
WHERE BD.BRNCHMOVE_ID = BM.ID
AND BD.BRNCHMOVE_CURR_ID = BM.CURR_ID
AND BD.CLNT_TYPE_ID = 11
AND BD.SUPPLIER_ID = 2
AND BD.PTITMMOVTP_ID = 2
AND BM.MONTH = &b3
AND BM.MOVE_TYPE = 2
AND BD.PITMMVDLTP_ID = 2
7-这个查询得到几个月
SELECT SBM.ID MONTH_ID ,SBM.NAME MONTH_NAME FROM SB_MONTH SBM ORDER BY SBM.ID
所以这些查询返回表中 &b3 = 1 的第一行,&b3 是月份的参数,我应该从查询号 7 中填充它。所以当 &b3 为 1 时应该返回第一行,&b3 = 4 应该返回第 4 行。
知道如何结合这些要求来实现吗?或任何建议
我的问题是我不明白如何结合这些查询来创建存储过程并构建报告。
解决方案
您可以单独计算所有需要的聚合,然后将它们加入到您的表中,以月份为单位。如果需要,Oracle 优化器可以将连接谓词推送到子查询中:
SELECT
SBM.ID MONTH_ID
,SBM.NAME MONTH_NAME
,agg.x1
,agg.x2
,agg.x3
,agg.x4
,agg.x5
,agg.x6
FROM SB_MONTH SBM
join (
SELECT BM.MONTH
,SUM(case when BD.CLNT_TYPE_ID IN ( 3,4 ) AND BD.SUPPLIER_ID = 1 then BD.QUANTITY end) x1
,SUM(case when BD.CLNT_TYPE_ID IN ( 3,4 ) AND BD.SUPPLIER_ID = 2 then BD.QUANTITY end) x2
,SUM(case when BD.CLNT_TYPE_ID = 2 AND BD.SUPPLIER_ID = 1 then BD.QUANTITY end) x3
,SUM(case when BD.CLNT_TYPE_ID = 2 AND BD.SUPPLIER_ID = 2 then BD.QUANTITY end) x4
,SUM(case when BD.CLNT_TYPE_ID = 11 AND BD.SUPPLIER_ID = 1 then BD.QUANTITY end) x5
,SUM(case when BD.CLNT_TYPE_ID = 11 AND BD.SUPPLIER_ID = 2 then BD.QUANTITY end) x5
FROM BRANCHS_MOVE_DTLS BD
,BRANCHS_MOVES BM
WHERE BD.BRNCHMOVE_ID = BM.ID
AND BD.BRNCHMOVE_CURR_ID = BM.CURR_ID
AND BD.CLNT_TYPE_ID IN ( 3,4,2,11 )
AND BD.SUPPLIER_ID IN (1,2)
AND BD.PTITMMOVTP_ID = 2
AND BM.MOVE_TYPE = 2
AND BD.PITMMVDLTP_ID = 2
group by BM.MONTH
) agg
on agg.MONTH = SBM.ID
ORDER BY SBM.ID;
推荐阅读
- php - 组合两个多维数组(有点复杂,但简单的例子)
- paypal - Paypal:如何链接英国的银行,而不是美国
- python - copy.copy 和 dataclasses.replace 之间的区别
- oracle-sqldeveloper - 比较 SQL Developer 中的存储过程 - 为匹配重音符号设置 NLS_CHARACTERSET
- python - 在python中创建流图,ValueError:'x'的行必须相等
- image - 如何在 React Native 中将图像 URI 转换为 Byte[](Byte array)
- scala - 使用具有默认值的 pureconfig 将配置解码为案例类
- python - 更改文本大小 Python
- mysql - 如何为只有一个地址作为参数的聊天应用组创建查询?
- azure - 运行 Set-AIPAuthentication 后 Azure 信息保护中没有 AIP 扫描程序节点