加入时出现重复结果 sql
duplicate results on join sql
我有两个 SQL 脚本。我需要结合他们两个的数据。我将它们设置为两个单独的 volatile tables 以将它们连接在一起以完成我的报告。下面的脚本只是我试图从数据中提取内容的一个示例。真正的脚本非常复杂,并且有许多子查询需要使用 volitile table 而不仅仅是常规连接。联接在 "customer_acct" 上。此脚本的目的是生成所有订单的记录,然后有一列关于是否已将退款应用于所述订单,由 [=23= 绑定].
我得到的结果给了我
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' 行中的每一行返回一个结果,并通过 'Refund' table 中的每个可能值复制它,尽管没有任何实际火柴。
有什么想法吗?我预先向您道歉,因为 SQL 对我来说比较新,我正在努力扩展我的知识。
您遇到问题的不是联接。您需要按帐号汇总退款 table 中的数据,以便按帐号仅获得一行。
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
您正在加入客户帐户。有 3 条记录中此帐户 ID 很常见。所以它重复三次。在 join 中,您需要添加另一个条件,相当于 to/similar 到 'where A.item = B.item or A.orderno=B.orderno' 。我不能准确地写出来,因为你没有提到列名。
我有两个 SQL 脚本。我需要结合他们两个的数据。我将它们设置为两个单独的 volatile tables 以将它们连接在一起以完成我的报告。下面的脚本只是我试图从数据中提取内容的一个示例。真正的脚本非常复杂,并且有许多子查询需要使用 volitile table 而不仅仅是常规连接。联接在 "customer_acct" 上。此脚本的目的是生成所有订单的记录,然后有一列关于是否已将退款应用于所述订单,由 [=23= 绑定].
我得到的结果给了我
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' 行中的每一行返回一个结果,并通过 'Refund' table 中的每个可能值复制它,尽管没有任何实际火柴。
有什么想法吗?我预先向您道歉,因为 SQL 对我来说比较新,我正在努力扩展我的知识。
您遇到问题的不是联接。您需要按帐号汇总退款 table 中的数据,以便按帐号仅获得一行。
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
您正在加入客户帐户。有 3 条记录中此帐户 ID 很常见。所以它重复三次。在 join 中,您需要添加另一个条件,相当于 to/similar 到 'where A.item = B.item or A.orderno=B.orderno' 。我不能准确地写出来,因为你没有提到列名。