改进 SQL 代码
我正在使用普适 SQL。我有以下多个 SQL 语句的 UNION。有没有办法清理这个问题,特别是在每个报表中选择的支付日期和位置号字段。有没有一种方法可以将其拉出来并且只有一个地方需要更改这两个字段?
(
SELECT
'23400' as Gl_Number,
y.Plan as Description,
0 as Hours,
ROUND(SUM(Ee_Curr),2) as Debit,
0 as Credit
FROM "PR_YLOC" y
LEFT JOIN PR_SUMM s ON (s.Summ_No = y.Summ_No)
WHERE y.Loc_No = 1041
AND s.Pay_Date = '2010-04-02'
AND y.Code IN (100, 105, 110)
AND y.Type = 3
GROUP BY y.Plan
) UNION (
SELECT
'72000' as Gl_Number,
y.Plan,
0,
ROUND(SUM(Er_Curr),2),
0
FROM "PR_YLOC" y
LEFT JOIN PR_SUMM s ON (s.Summ_No = y.Summ_No)
WHERE y.Loc_No = 1041
AND s.Pay_Date = '2010-04-02'
AND y.Code IN (100, 105, 110)
AND y.Type = 3
GROUP BY y.Plan
) UNION (
SELECT '24800',
c.Plan,
0,
ROUND(SUM(Ee_Amt),2),
0
FROM "PR_CDED" c WHERE Pay_Date = '2010-04-02' AND Loc_No = 1041 AND Code = 100
GROUP BY c.Plan
) UNION (
SELECT '24800',
c.Plan,
0,
0,
ROUND(SUM(Ee_Amt),2)
FROM "PR_CDED" c WHERE Pay_Date = '2010-04-02' AND Loc_No = 1041 AND Code = 115
GROUP BY c.Plan
) UNION (
SELECT '24150',
c.Plan,
0,
0,
ROUND(SUM(Ee_Amt),2)
FROM "PR_CDED" c WHERE Pay_Date = '2010-04-02' AND Loc_No = 1041 AND Code = 241
GROUP BY c.Plan
) UNION (
SELECT '24150',
c.Plan,
0,
ROUND(SUM(Ee_Amt),2),
0
FROM "PR_CDED" c WHERE Pay_Date = '2010-04-02' AND Loc_No = 1041 AND Code = 239
GROUP BY c.Plan
) UNION (
SELECT '24120',
c.Plan,
0,
ROUND(SUM(Ee_Amt),2),
0
FROM "PR_CDED" c WHERE Pay_Date = '2010-04-02' AND Loc_No = 1041 AND Code = 230
GROUP BY c.Plan
) UNION (
SELECT '24100',
c.Plan,
0,
ROUND(SUM(Ee_Amt),2),
0
FROM "PR_CDED" c WHERE Pay_Date = '2010-04-02' AND Loc_No = 1041 AND Code = 225
GROUP BY c.Plan
) UNION (
SELECT '23800',
c.Plan,
0,
ROUND(SUM(Ee_Amt),2),
0
FROM "PR_CDED" c WHERE Pay_Date = '2010-04-02' AND Loc_No = 1041 AND Code = 245
GROUP BY c.Plan
) UNION (
select m.Def_Dept as Gl_Number, t.Short_Desc,
(SELECT SUM(Hours) FROM pr_earn en WHERE en.Loc_No = e.Loc_No AND en.Emp_No = e.Emp_No AND en.Pay_Date = e.Pay_Date AND en.Pay_Code = e.Pay_Code) as Hours,
(SELECT SUM(Pay_Amt) FROM pr_earn en WHERE en.Loc_No = e.Loc_No AND en.Emp_No = e.Emp_No AND en.Pay_Date = e.Pay_Date AND en.Pay_Code = e.Pay_Code) as Debit,
0
from pr_earn e
left join pr_mast m on (e.Loc_No = m.Loc_No and e.Emp_No = m.Emp_No)
left join pr_ptype t ON (t.Code = e.Pay_Code)
where e.loc_no = 1041 and e.pay_date = '2010-04-02'
group by m.Def_Dept, t.Short_Desc
)
谢谢
I'm using Pervasive SQL. I have the following UNION of mulitple SQL statements. Is there a way to clean this up, especially the Pay Date an the Loc No fields that are selected in each statement. Is there a way to pull this out and have only one place to need to change those two fields?
(
SELECT
'23400' as Gl_Number,
y.Plan as Description,
0 as Hours,
ROUND(SUM(Ee_Curr),2) as Debit,
0 as Credit
FROM "PR_YLOC" y
LEFT JOIN PR_SUMM s ON (s.Summ_No = y.Summ_No)
WHERE y.Loc_No = 1041
AND s.Pay_Date = '2010-04-02'
AND y.Code IN (100, 105, 110)
AND y.Type = 3
GROUP BY y.Plan
) UNION (
SELECT
'72000' as Gl_Number,
y.Plan,
0,
ROUND(SUM(Er_Curr),2),
0
FROM "PR_YLOC" y
LEFT JOIN PR_SUMM s ON (s.Summ_No = y.Summ_No)
WHERE y.Loc_No = 1041
AND s.Pay_Date = '2010-04-02'
AND y.Code IN (100, 105, 110)
AND y.Type = 3
GROUP BY y.Plan
) UNION (
SELECT '24800',
c.Plan,
0,
ROUND(SUM(Ee_Amt),2),
0
FROM "PR_CDED" c WHERE Pay_Date = '2010-04-02' AND Loc_No = 1041 AND Code = 100
GROUP BY c.Plan
) UNION (
SELECT '24800',
c.Plan,
0,
0,
ROUND(SUM(Ee_Amt),2)
FROM "PR_CDED" c WHERE Pay_Date = '2010-04-02' AND Loc_No = 1041 AND Code = 115
GROUP BY c.Plan
) UNION (
SELECT '24150',
c.Plan,
0,
0,
ROUND(SUM(Ee_Amt),2)
FROM "PR_CDED" c WHERE Pay_Date = '2010-04-02' AND Loc_No = 1041 AND Code = 241
GROUP BY c.Plan
) UNION (
SELECT '24150',
c.Plan,
0,
ROUND(SUM(Ee_Amt),2),
0
FROM "PR_CDED" c WHERE Pay_Date = '2010-04-02' AND Loc_No = 1041 AND Code = 239
GROUP BY c.Plan
) UNION (
SELECT '24120',
c.Plan,
0,
ROUND(SUM(Ee_Amt),2),
0
FROM "PR_CDED" c WHERE Pay_Date = '2010-04-02' AND Loc_No = 1041 AND Code = 230
GROUP BY c.Plan
) UNION (
SELECT '24100',
c.Plan,
0,
ROUND(SUM(Ee_Amt),2),
0
FROM "PR_CDED" c WHERE Pay_Date = '2010-04-02' AND Loc_No = 1041 AND Code = 225
GROUP BY c.Plan
) UNION (
SELECT '23800',
c.Plan,
0,
ROUND(SUM(Ee_Amt),2),
0
FROM "PR_CDED" c WHERE Pay_Date = '2010-04-02' AND Loc_No = 1041 AND Code = 245
GROUP BY c.Plan
) UNION (
select m.Def_Dept as Gl_Number, t.Short_Desc,
(SELECT SUM(Hours) FROM pr_earn en WHERE en.Loc_No = e.Loc_No AND en.Emp_No = e.Emp_No AND en.Pay_Date = e.Pay_Date AND en.Pay_Code = e.Pay_Code) as Hours,
(SELECT SUM(Pay_Amt) FROM pr_earn en WHERE en.Loc_No = e.Loc_No AND en.Emp_No = e.Emp_No AND en.Pay_Date = e.Pay_Date AND en.Pay_Code = e.Pay_Code) as Debit,
0
from pr_earn e
left join pr_mast m on (e.Loc_No = m.Loc_No and e.Emp_No = m.Emp_No)
left join pr_ptype t ON (t.Code = e.Pay_Code)
where e.loc_no = 1041 and e.pay_date = '2010-04-02'
group by m.Def_Dept, t.Short_Desc
)
Thanks
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
你能用这样的东西替换中间的一组 SELECT 语句吗?
这是一个 T-SQL CASE 语句,但我确信 Oracle PL/SQL 也有类似的东西。
Could you replace the middle set of SELECT statements with something like this?
That's a T-SQL CASE statement, but I'm sure Oracle PL/SQL has something similar.
您可以仅用一个具有过滤条件
AND Code IN (... ,...,...)
。Instead of many selects with almost the same filter criteria (difference at "
AND Code = ...
"), you could replace with only one select with filter criteriaAND Code IN (..., ..., ...)
.似乎您正在尝试在不影响性能的情况下获得更多可维护性。我不知道这个平台,但我猜你可以将一个 where 子句移到最后,将 Union 作为子查询,并且查询优化器可能能够找出在每个联合集中应用 where 条件。
Seems like you're trying to have more maintainability without affecting performance. I don't know this platform, but I would guess that you could move one where clause to the end, with your Unions as a subquery, and that the query optimzer might be able to figure out to apply the where conditions in each unioned set.
您可以为此使用 case 语句。例如:
You can use a case statement for this. E.g.: