首页 > 解决方案 > 如何最好地使用 sql 查询中的代码列表作为另一个查询的输入

问题描述

我有几个 SQL 我试图一起使用来生成一个报告,显示我想从另一个查询中提取的给定代码的 2 个字段的 AVG 数量。所以这个查询返回代码列表

SELECT DISTINCT
  cc.code AS `CC Code`
FROM ds
  LEFT OUTER JOIN dd
    ON ds.dd_id = dd.id
  LEFT OUTER JOIN ii
    ON ds.ii_id = ii.id
  LEFT OUTER JOIN dcc
    ON ds.id = dcc.dos_id
  LEFT OUTER JOIN cc
    ON dcc.cpt_id = cc.id
  LEFT OUTER JOIN bi
    ON ds.bi_id = bi.id
  LEFT OUTER JOIN cs
    ON bi.claim_status = cs.id
WHERE ii.company = "Alpha"
AND cs.status = "On HOLD"
AND dcc.amount_allowed > 0

这将返回大约 25 个唯一代码的列表。然后我运行这个手动插入其中的每一个以获得使用该代码的 2 个字段的平均金额。

SELECT
  cc.code AS `CC Code`,
  CAST(AVG(dcc.amount_allowed) AS decimal(10, 2)) `AVG Allowed`,
  CAST(AVG(dcc.paid_amount) AS decimal(10, 2)) `Paid Avg`,
  ii.company AS `I Company`
FROM ds
  LEFT OUTER JOIN dd
    ON ds.dd_id = dd.id
  LEFT OUTER JOIN ii
    ON ds.ii_id = ii.id
  LEFT OUTER JOIN dcc
    ON ds.id = dcc.dos_id
  LEFT OUTER JOIN cc
    ON dcc.cpt_id = cc.id
  LEFT OUTER JOIN bi
    ON ds.bi_id = bi.id
WHERE ii.company = "Alpha"
AND code = '35647'
AND dcc.amount_allowed > 0

它返回结果如

抄送代码 平均允许 平均付费 保险公司
35647 9373.44 8652.30 Α

我想运行它让它传递每个代码并返回每个代码的结果。

这样做最好怎么做?谢谢你的帮助

标签: mysql

解决方案


让我们试着专注于你首先想要得到的东西。忘记查询中未使用的所有其他表;在SELECTWHERE. 例如:

SELECT
  cc.code AS `CC Code`,
  CAST(AVG(dcc.amount_allowed) AS decimal(10, 2)) `AVG Allowed`,
  CAST(AVG(dcc.paid_amount) AS decimal(10, 2)) `Paid Avg`,
  ii.company AS `I Company`
FROM ds
/* comment out this part
  LEFT OUTER JOIN dd
    ON ds.dd_id = dd.id */
  LEFT OUTER JOIN ii
    ON ds.ii_id = ii.id
  LEFT OUTER JOIN dcc
    ON ds.id = dcc.dos_id
  LEFT OUTER JOIN cc
    ON dcc.cpt_id = cc.id
/* comment out this part
  LEFT OUTER JOIN bi
    ON ds.bi_id = bi.id*/
WHERE ii.company = "Alpha"
AND code = '35647'
AND dcc.amount_allowed > 0

然后根据您的条件“我想运行它让它传递每个代码并返回每个代码的结果”,将查询修改为如下所示:

SELECT
  cc.code AS `CC Code`,
  CAST(AVG(dcc.amount_allowed) AS decimal(10, 2)) `AVG Allowed`,
  CAST(AVG(dcc.paid_amount) AS decimal(10, 2)) `Paid Avg`,
  ii.company AS `I Company`
FROM ds
  LEFT OUTER JOIN ii
    ON ds.ii_id = ii.id
  LEFT OUTER JOIN dcc
    ON ds.id = dcc.dos_id
  LEFT OUTER JOIN cc
    ON dcc.cpt_id = cc.id
WHERE dcc.amount_allowed > 0
GROUP BY cc.code, ii.company;

*commented out part omitted here for better view.
*removed > WHERE ii.company = "Alpha" AND code = '35647'.

由于您有一个聚合 ( AVG()),因此任何非聚合列SELECT都应该在GROUP BY.

如果是ii.company,有几个选项:

  1. 如果您不想要它,请将其从SELECT和中删除GROUP BY
  2. 如果您真的不在乎ii.company返回什么,您可以将其更改为ANY_VALUE(ii.company)并保留在GROUP BY.
  3. 如果您想显示ii.company附加到单个的所有内容cc.code,您可以更改为GROUP_CONCAT(DISTINCT ii.company)并从中删除它GROUP BY

看看这是否适合你。


推荐阅读