繁体   English   中英

Oracle SQL-同一表中的2个总计

[英]Oracle SQL - 2 totals from the same table

我是Oracle Sql的新手,并且对如何通过同一张表上的过滤器总计金额有一个了解。 例如

员工表

Emp_ID 
Emp_name 

交易档案

TR_ID (= Emp_ID )

TR_QTR
TR_Type           
TR_Xref
TR_Amt

员工表

| EMP_ID | EMP_NAME       |
+--------+----------------+
|  1     | sam spade      |
|  2     | junior samples |
|  3     | april showers  |

交易表

| ID | QTR | Type | Xref | Amt   |
+----+-----+------+------+-------+
|  1 |  1  |  W   |  F   | 5.00  |
|  1 |  1  |  W   |  T   | 2.23  |
|  1 |  2  |  W   |  T   | 5.55  |
|  1 |  1  |  W   |  T   | 4.44  |
|  1 |  1  |  W   |  F   | 3.25  |
|  1 |  1  |  G   |  B   | 1.23  |
|  2 |  1  |  W   |  T   | 6.10  |
|  2 |  1  |  G   |  Z   | 12.12 |
|  2 |  1  |  W   |  F   | 9.88  |
|  2 |  1  |  W   |  F   | 8.70  |
|  3 |  1  |  W   |  F   | 4.00  |
|  3 |  1  |  W   |  T   | 3.00  |
|  3 |  1  |  W   |  T   | 5.00  |
|  3 |  2  |  W   |  T   | 7.00  |

我希望选择语句与用户选择的TR_QTR = 1输出,我期望:

| ID | Name          | Total TR_Amt                | Total TR_AMT                 |
|    |               |(TR_Type = W and TR_Xref = F)| (TR_Type = W and TR_Xref = T)|
+----+---------------+-----------------------------+------------------------------+
|  1 |sam spade      |    8.25                     |      6.67                    |
|  2 |junior samples |    18.58                    |      6.10                    |
|  3 |april showers  |    4.00                     |      8.00                    |

我是否对要累加的每个金额对同一张表进行两次左联接(事务文件)?

任何帮助将不胜感激

您想要类似的东西:

SELECT 
  e.Emp_ID
, e.Emp_name
, SUM(CASE WHEN t.TR_Type = 'W' AND t.TR_Xref = 'F') THEN TR_Amt ELSE 0 END) AS Total_W_F
, SUM(CASE WHEN t.TR_Type = 'W' AND t.TR_Xref = 'T') THEN TR_Amt ELSE 0 END) AS Total_W_T
FROM Employee_Table e
LEFT OUTER JOIN Transaction_Table t ON e.Emp_ID = t.TR_ID
WHERE t.TR_QTR = 1
GROUP BY
  e.Emp_ID
, e.Emp_name

基本上,对于条件为true的每一行,您都是SUM TR_Amt,否则为SUM 0。

按员工ID对交易进行分组,并为两个XREF建立总计:

select
  e.id,
  e.name,
  coalesce(t.sumf, 0) as total_f,
  coalesce(t.sumt, 0) as total_t
from employee e
left join
(
  select 
    id,
    sum(case when xref = 'F' then amt end) as sumf,
    sum(case when xref = 'T' then amt end) as sumt
  from tr
  where type = 'W'
  and qtr = 1
  group by id
) t on t.id = e.id;

这应该做。

WITH tr_wf AS (
SELECT tr_id as wfid, sum(tr_amt) as tr1
  FROM transaction
 WHERE tr_type = 'W' AND tr_xref = 'F'
GROUP BY tr_id
), tr_wt AS (
SELECT tr_id as wtid, sum(tr_amt) as tr2
  FROM transaction
 WHERE tr_type = 'W' AND trxref = 'T'
GROUP BY tr_id
)
SELECT e.emp_id, e.emp_name, tr1 AS total_tr_amt_w_f, tr2 AS total_tr_amt_w_t
  FROM employee e
  JOIN tr_wf ON e.emp_id = wfid
  JOIN tr_wt ON e.emp_id = wtid

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM