假设我有3家公司都有客户。我想编写一个代码,搜索所有3家公司的已终止和下岗的客户,然后返回该客户所在的所有公司,无论客户与这些公司的状态如何。
我拥有的最佳代码是:
SELECT
x.name,
x.social,
CASE
when (SUM(x.company) = 1) then ('A')
when (SUM(x.company) = 2) then ('B')
when (SUM(x.company) = 4) then ('C')
when (SUM(x.company) = 3) then ('A + B')
when (SUM(x.company) = 5) then ('A + C')
when (SUM(x.company) = 6) then ('B + C')
when (SUM(x.company) = 7) then ('X')
else NULL end AS company
FROM
(SELECT
a.name as name,
a.socsec,
("1") AS company
FROM
a
WHERE
(a.status = 'Active') AND
((a.trans IN ('Payroll','HR')) AND
(a.result IN ('Terminated','LaidOff'))
GROUP BY
a.socsec
UNION
SELECT
b.name as name,
b.socsec,
("2") AS company
FROM
b
WHERE
(b.status = 'Active') AND
((b.trans IN ('Payroll','HR')) AND
(b.result IN ('Terminated','LaidOff'))
GROUP BY
b.socsec
UNION
SELECT
c.name as name,
c.socsec,
("4") AS company
FROM
c
WHERE
(c.status = 'Active') AND
((c.trans IN ('Payroll','HR')) AND
(c.result IN ('Terminated','LaidOff'))
GROUP BY
c.socsec) idx
GROUP BY
x.socsec
ORDER BY
company
此代码仅返回符合已终止过滤器的客户帐户,因此,如果我的客户在公司A中有终止代码但在B中有正常帐户,则只返回她有A帐户。 我喜欢它返回' A + B'对于该客户,只要客户账户中的任何一个满足过滤器,就应该返回客户拥有账户的所有公司。
我能想到的最好的解决方案是UNIONing所有3家公司之间的所有帐户,然后在UNION之外的OR语句中应用过滤器,但运行它需要很长时间冻结,我甚至不确定它是否会起作用。 / p>
有什么想法吗?
答案 0 :(得分:0)
我当时认为这可行,但它需要很长时间才能冻结,这是否是我的系统无法处理的有效解决方案?
SELECT
x.name,
x.social,
CASE
when (SUM(x.company) = 1) then ('A')
when (SUM(x.company) = 2) then ('B')
when (SUM(x.company) = 4) then ('C')
when (SUM(x.company) = 3) then ('A + B')
when (SUM(x.company) = 5) then ('A + C')
when (SUM(x.company) = 6) then ('B + C')
when (SUM(x.company) = 7) then ('X')
else NULL end AS co
FROM
(
SELECT
a.name,
a.social,
("1") AS company
FROM a
UNION
SELECT
b.name,
b.social,
("2") AS company
FROM b
UNION
SELECT
c.name,
c.social,
("4") AS company
FROM c
) idx
LEFT OUTER JOIN a ON a.social = x.social
LEFT OUTER JOIN b ON b.socsec = x.socsec
LEFT OUTER JOIN c ON c.socsec = x.socsec
WHERE
((a.status = 'Active') AND
(a.balance > 0.00) AND
(a.trans IN ('Payroll','HR')) AND
(a.result IN ('Terminated','LaidOff')))
OR
((b.status = 'Active') AND
(b.balance > 0.00) AND
(b.trans IN ('Payroll','HR')) AND
(b.result IN ('Terminated','LaidOff')))
OR
((c.status = 'Active') AND
(c.balance > 0.00) AND
(c.trans IN ('Payroll','HR')) AND
(c.result IN ('Terminated','LaidOff')))
GROUP BY x.social
ORDER BY co