连接sql上的重复结果

时间:2016-01-21 00:23:14

标签: sql join teradata

我有两个SQL脚本。我需要结合两者的数据。我已将它们设置为两个单独的易失性表格,以便将它们连接在一起以完成我的报告。下面的脚本只是我试图从数据中提取的一个例子。真正的脚本非常复杂,并且有许多子查询值得使用volitile表而不仅仅是常规连接。加入是" customer_acct"。此脚本的目的是生成所有订单的记录,然后列出是否已对所述订单应用退款,由&绑定#34; customer_acct&#34 ;.

我得到的结果给了我

CUST_ACCT    PRODUCT_ORDERED    REFUND_AMT
1111111      item#5             10.00
1111111      item#5             20.00
1111111      item#5             30.00
2222222      item#5             10.00
2222222      item#5             20.00
2222222      item#5             30.00
3333333      item#5             10.00
3333333      item#5             20.00
3333333      item#5             30.00

我的脚本总结如下。

CREATE VOLATILE TABLE ORDERS, NO LOG AS(
SELECT 
p.customer_acct
p.product_ordered
etc.
FROM server p
)WITH DATA PRIMARY INDEX (p.customer_acct)
ON COMMIT PRESERVE ROWS; 

CREATE VOLATILE TABLE REFUND, NO LOG AS(
SELECT
c.customer_acct
c.refund_amt
c.date
etc.
FROM server c
)WITH DATA PRIMARY INDEX (c.customer_acct)
ON COMMIT PRESERVE ROWS; 

SELECT DISTINCT
a.cust_acct
,a.product_ordered
,b.refund_amt

FROM ORDERS a

LEFT Join REFUND B
on b.cust_Accta = a.customer_acct
;

DROP TABLE ORDERS;
DROP TABLE REFUND;

基本上,脚本会返回' Orders'中每一行的结果。行,并在“退款”中按每个可能的值复制它。表,尽管没有任何真正的比赛。

有什么想法吗?我在前面道歉,因为SQL对我来说相对较新,我试图扩展我的知识。

2 个答案:

答案 0 :(得分:0)

这不是您遇到问题的联接。您需要按帐号汇总退款表中的数据,才能按帐号只获得一行。

SELECT DISTINCT
a.cust_acct
,a.product_ordered
,case when count(b.cust_Accta)=0 then 'no refund' else 'refund' end as refund

FROM ORDERS a

LEFT Join REFUND B
on b.cust_Accta = a.customer_acct
GROUP BY a.customer_acct

或者你可以使用sum()来取回退款金额:

SELECT DISTINCT
a.cust_acct
,a.product_ordered
,sum(b.refund_amt) as refund_amount

FROM ORDERS a

LEFT Join REFUND B
on b.cust_Accta = a.customer_acct
GROUP BY a.customer_acct

答案 1 :(得分:0)

您正在加入客户帐户。这个帐户很常见,有3条记录。所以它重复了三次。在连接中,您需要添加另一个条件,相当于/类似于'where A.item = B.item或A.orderno = B.orderno'。我不能完全写出来,因为你没有提到列名。