【问题标题】:I'm new to SQL and thinking is there any way to simplify this Query?我是 SQL 新手,我想有没有办法简化这个查询?
【发布时间】:2020-09-26 13:16:54
【问题描述】:

我对 SQL 真的很陌生,这样做是为了满足我的基本工作需求,基本上我不是技术人员。但我很想知道这里有什么方法可以简化我的 SQL 代码:

SET sql_mode = '';


SELECT DISTINCT partner.kode_agent,
                institusi.nama,
                count(proposal.kode_proposal) AS 'Jumlah Proposal',
                sum(project.jumlah_pencairan) AS 'Jumlah Pencairan'
FROM brw_proposals proposal
JOIN ms_agent partner ON proposal.kode_agent = partner.kode_agent
JOIN ms_agent_institusi institusi ON partner.kode_institusi = institusi.kode_institusi
JOIN ms_projects project ON proposal.kode_proposal = project.kode_proposal
WHERE institusi.nama like 'BMT%' and proposal.status_proposal_id = 4
  OR institusi.nama like 'BMT%' and proposal.status_proposal_id = 8
  OR institusi.nama like 'BMT%' and proposal.status_proposal_id = 3
  OR institusi.nama like 'BMT%' and proposal.status_proposal_id = 10
  OR institusi.nama like 'Baitul Maal Wat%' and proposal.status_proposal_id = 4
  OR institusi.nama like 'Baitul Maal Wat%' and proposal.status_proposal_id = 8
  OR institusi.nama like 'Baitul Maal Wat%' and proposal.status_proposal_id = 3
  OR institusi.nama like 'Baitul Maal Wat%' and proposal.status_proposal_id = 10
  OR institusi.nama like 'Ksp%' and proposal.status_proposal_id = 4
  OR institusi.nama like 'Ksp%' and proposal.status_proposal_id = 8
  OR institusi.nama like 'Ksp%' and proposal.status_proposal_id = 3
  OR institusi.nama like 'Ksp%' and proposal.status_proposal_id = 10
GROUP BY institusi.nama

因为我猜 WHERE 子句太多了,而且我对子查询不太熟悉。

希望任何人都可以分享他们的经验来改进我的代码!谢谢

【问题讨论】:

标签: mysql sql redash


【解决方案1】:

这是简化的查询:

SELECT DISTINCT partner.kode_agent,
                institusi.nama,
                count(proposal.kode_proposal) AS 'Jumlah Proposal',
                sum(project.jumlah_pencairan) AS 'Jumlah Pencairan'
FROM brw_proposals proposal
JOIN ms_agent partner ON proposal.kode_agent = partner.kode_agent
JOIN ms_agent_institusi institusi ON partner.kode_institusi = institusi.kode_institusi
JOIN ms_projects project ON proposal.kode_proposal = project.kode_proposal
WHERE (institusi.nama like 'BMT%' OR institusi.nama like 'Ksp%' OR institusi.nama like 'Baitul Maal Wat%') and proposal.status_proposal_id IN (4,8,3,10)
GROUP BY institusi.nama

您可以使用IN 子句匹配多个值,例如

proposal.status_proposal_id IN (4,8,3,10)

【讨论】:

  • 您可以通过institusi.nama REGEXP '^BMT|^Ksp|^Baitul Maal Wat'更进一步
  • 只有在使该查询高效运行所需的所有索引都准备就绪时,该查询才会被优化......这个答案只给出了原始查询的较短版本。
  • @Luuk 他在问题中提到;他想简化 SQL 查询。
【解决方案2】:

这是一个有效查询的示例。没有足够的信息来说明它是否满足您的要求...

SELECT p.kode_agent
     , i.nama
     , COUNT(k.kode_proposal) 'Jumlah Proposal'
     , SUM(j.jumlah_pencairan) 'Jumlah Pencairan'
  FROM brw_proposals k
  JOIN ms_agent p 
    ON k.kode_agent = p.kode_agent
  JOIN ms_agent_institusi i
    ON i.kode_institusi = p.kode_institusi 
  JOIN ms_projects j
    ON k.kode_proposal = j.kode_proposal
 WHERE k.status_proposal_id IN(4,8,3,10)
   AND ( i.nama like 'BMT%'
      OR i.nama like 'Baitul Maal Wat%'
      OR i.nama like 'Ksp%' 
       )
 GROUP 
    BY i.nama
     , p.kode_agent;

【讨论】:

    猜你喜欢
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    相关资源
    最近更新 更多