【问题标题】:How to format Query如何格式化查询
【发布时间】:2015-08-13 03:36:12
【问题描述】:

我写的查询有问题。它首先计算以下值并将按 da_no 分组的每个总和放入一个单独的临时表中。

目标 目标平衡 软质押 软质押余额 硬承诺 硬质押余额 提出至今

由于某种原因,我无法弄清楚如何格式化查询,以便无论是否有任何临时表为空,都可以给出结果。我注意到,如果我对连接重新排序,查询会产生结果,但如果填充了任何列,我需要一个结果。

示例一:没有任何结果

SELECT
COALESCE(Goal, 0.00) AS 'Goal',
COALESCE((Goal - RaisedToDate),0.00) AS 'GoalBalnce',
COALESCE(SoftPledge,0.00) AS SoftPledge,
COALESCE(SoftPledgeBalance,0.00) AS SoftPledgeBalance,
COALESCE(HardPledge,0.00) AS HardPledge,
COALESCE(HardlePledgeBalance,0.00) AS HardlePledgeBalance,
COALESCE(RaisedToDate,0.00) AS 'RaisedToDate',
da.da_no, TG.da_no
FROM
donations_accounts da
JOIN TEMP_GOAL TG on da.da_no = TG.da_no
JOIN TEMP_RAISED_TO_DATE TRTD ON da.da_no = TRTD.da_no
JOIN TEMP_HARD_PLEDGE_BALANCE THPB ON da.da_no = THPB.da_no
JOIN TEMP_SOFT_PLEDGE_BALANCE TSPB ON da.da_no = TSPB.da_no
JOIN TEMP_HARD_PLEDGE THP on da.da_no = THP.da_no;

示例二:产生一个记录

SELECT
COALESCE(Goal, 0.00) AS 'Goal',
COALESCE((Goal - RaisedToDate),0.00) AS 'GoalBalnce',
COALESCE(SoftPledge,0.00) AS SoftPledge,
COALESCE(SoftPledgeBalance,0.00) AS SoftPledgeBalance,
COALESCE(HardPledge,0.00) AS HardPledge,
COALESCE(HardlePledgeBalance,0.00) AS HardlePledgeBalance,
COALESCE(RaisedToDate,0.00) AS 'RaisedToDate',
  da.da_no
FROM
donations_accounts da
JOIN TEMP_HARD_PLEDGE THP on da.da_no = THP.da_no
LEFT JOIN TEMP_GOAL TG on da.da_no = TG.da_no
LEFT JOIN TEMP_RAISED_TO_DATE TRTD ON da.da_no = TRTD.da_no
LEFT JOIN TEMP_HARD_PLEDGE_BALANCE THPB ON da.da_no = THPB.da_no
LEFT JOIN TEMP_SOFT_PLEDGE_BALANCE TSPB ON da.da_no = TSPB.da_no;

目标、GoalBalance、SoftPledge、SoftPledgeBalance、HardPledge、HardlePledgeBalance、RaisedToDate、da_no

0.00, 0.00, 0.00, 0.00, 5000.00, 0.00, 0.00, 2352

主要问题是我不知道哪个临时表中会有值,哪个没有,因此很难确定要从哪个表离开连接。请让我知道是否有另一种方法可以编写此脚本以获得正确的结果集。谢谢!

【问题讨论】:

  • 为什么不全部使用LEFT JOIN
  • 我们在一些conditional joinsleft joins 上磕磕绊绊,似乎是路线。
  • 当我使用 LEFT JOIN 时,它会显示单个 da_no,我尝试限制大于 0.00,但由于某种原因,它不会将其识别为 0.00 或 null
  • @drew 我应该只是一个“条件连接”吗?
  • 当然每个人都不一样,但请查看answer的第 3、4、5 行

标签: mysql sql


【解决方案1】:
select 
COALESCE(Goal, 0.00) AS 'Goal',
COALESCE((Goal - RaisedToDate),0.00) AS 'GoalBalnce',
COALESCE(SoftPledge,0.00) AS SoftPledge,
COALESCE(SoftPledge - SoftRaised, 0.00) AS 'SoftPledgeBalance',
COALESCE(HardPledge,0.00) AS HardPledge,
COALESCE(HardPledge - HardRaised,0.00) AS HardlePledgeBalance,
COALESCE(RaisedToDate,0.00) AS 'RaisedToDate',
da.da_no
from donations_accounts da


LEFT JOIN (SELECT COALESCE(SUM(pl_debit), 0.00) AS 'HardPledge', pl.da_no FROM pledges pl WHERE pl_status = 1 AND pl.e_no = 22386 GROUP BY da_no) H on H.da_no = da.da_no
LEFT JOIN (SELECT COALESCE(SUM(eg_goal), 0.00) AS 'Goal', da_no FROM events_goals WHERE e_no = 22386 GROUP BY da_no) g on g.da_no = da.da_no
LEFT JOIN (SELECT COALESCE(SUM(disb_amount), 0.00) AS 'RaisedToDate', da_no FROM disbursements d LEFT JOIN contacts c ON d.c_no = c.c_no WHERE d.disb_status = 1 and c.c_status = 1 AND e_no = 22386 GROUP BY da_no) R on R.da_no = da.da_no
LEFT JOIN (SELECT COALESCE(SUM(sp.sp_softpledge), 0.00) 'SoftPledge', sp.da_no FROM soft_pledges sp JOIN events_cohosts ec ON sp.ec_no = ec.ec_no LEFT JOIN contacts c on ec.c_no = c.c_no WHERE sp.da_no IS NOT NULL AND ec.ec_status = 1 AND sp_status = 1 AND c_status = 1 AND e_no = 22386 GROUP BY da_no) s on s.da_no = da.da_no
LEFT JOIN (SELECT COALESCE(SUM(disb_amount), 0.00) AS 'SoftRaised', d.da_no FROM disbursements d WHERE disb_status = 1 AND b_no IS NOT NULL AND b_no <> 0 AND e_no = 22386 GROUP BY da_no) sb on sb.da_no = da.da_no
LEFT JOIN (SELECT COALESCE(SUM(disb_amount), 0.00) AS 'HardRaised',pl.da_no FROM pledges pl JOIN disbursements d ON d.c_no = pl.c_no  WHERE pl_status = 1 AND d.disb_status = 1 AND pl.e_no = 22386 AND d.e_no = 22386 GROUP BY da_no) hb on hb.da_no = da.da_no

where 
(HardPledge > 0.00 
or Goal > 0.00 
or RaisedToDate > 0.00 
or HardRaised > 0.00
or SoftPledge > 0.00
or SoftRaised > 0.00);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多