总公司par_code 为空 名字为company,子公司的par_code 为总公司的company,非子公司par_code为其他,写出sql,向帆软传公司参数,查询出总公司 子公司 非子公司的数据,各个子公司显示各个子公司数据,非子公司合计成一条数据
时间: 2024-09-11 21:04:50 浏览: 40
首先,假设我们有一个公司表(company_table),它包含以下字段:
- id:公司的唯一标识
- name:公司的名称
- par_code:父公司代码,表示公司的归属层级
我们想要查询总公司、子公司及非子公司,并且对于非子公司,我们希望将其数据合并为一条记录。以下是一个可能的SQL查询语句实现这一需求:
```sql
SELECT
COALESCE(c.par_code, '非子公司') AS par_code,
c.name,
COUNT(*) AS company_count
FROM
company_table c
GROUP BY
COALESCE(c.par_code, '非子公司')
ORDER BY
par_code;
```
在这个查询中,`COALESCE`函数用于将`par_code`为空的情况替换成'非子公司',以便于在非子公司的情况下,所有的非子公司记录能够按照'非子公司'进行合并统计。`GROUP BY`语句用于按公司层级分组,这里将所有无父公司的记录分在一组(即非子公司),`COUNT(*)`用于计数每组中记录的数量。`ORDER BY`用于对结果进行排序。
相关问题
总公司par_code 为空 名字为company,子公司的par_code 为总公司的company,非子公司par_code为其他,向帆软传公司参数,写出sql查询出总公司 子公司 非子公司的数据,各个子公司显示各个子公司数据,非子公司合计成一条数据
为了根据您给出的情况查询总公司、子公司以及非子公司的数据,我们需要假设有一个表,例如名为`companies`,其中包含公司名称和父公司代码`par_code`两个字段。以下是一个基于这些假设的SQL查询示例:
```sql
SELECT
c1.par_code AS ParentCompanyCode,
c1.company_name AS CompanyName,
COUNT(*) AS NumberOfSubsidiaries,
CASE
WHEN c1.par_code IS NULL THEN '总公司'
WHEN c2.par_code IS NOT NULL THEN '子公司'
ELSE '非子公司'
END AS CompanyType
FROM
companies c1
LEFT JOIN companies c2 ON c1.company_name = c2.par_code
GROUP BY
c1.par_code, c1.company_name
ORDER BY
ParentCompanyCode, CompanyType;
```
在这个查询中,我们使用了左连接(LEFT JOIN)来匹配每个公司和其可能的子公司。我们根据`par_code`是否为空、是否能找到对应的子公司来判断公司类型。对于总公司,`par_code`应该是空的。对于子公司,会在子查询中找到一个匹配的`par_code`。对于非子公司,`par_code`既不为空,也不会在子查询中找到匹配的`par_code`,因此它们将单独统计。
请注意,这个SQL查询的准确性依赖于数据库的具体表结构和字段。如果字段名或者表名有所不同,您需要相应地调整SQL查询。
SELECT f.PAR_FAULT_CODE AS "parFaultCode", f.FAULT_NAME AS "faultName", COALESCE( r.REPORT_DEPT_CODE, 'N/A' ) AS "reportDeptCode", COUNT( r.REPORT_DEPT_CODE ) AS "report", ( SELECT COUNT( * ) FROM FAULT_REPORT d WHERE d.FAULT_CODE = f.FAULT_CODE ) AS "reportCount" FROM FAULT_TYPE f LEFT JOIN FAULT_REPORT r ON f.FAULT_CODE = r.FAULT_CODE GROUP BY f.PAR_FAULT_CODE, f.FAULT_NAME, COALESCE( r.REPORT_DEPT_CODE, 'N/A' ) ORDER BY f.PAR_FAULT_CODE, f.FAULT_NAME为什么在oracle中报不是group by表达式,请帮我正确修改
在Oracle中,如果SELECT语句中的字段包含聚合函数(如COUNT、SUM等),则GROUP BY子句中必须包含所有未聚合的字段。在你的查询中,COUNT(r.REPORT_DEPT_CODE)是一个聚合函数,但是GROUP BY子句中只包含了f.PAR_FAULT_CODE、f.FAULT_NAME和COALESCE(r.REPORT_DEPT_CODE, 'N/A')三个字段,没有包含COUNT(r.REPORT_DEPT_CODE)。因此,Oracle会报错,提示你需要将COUNT(r.REPORT_DEPT_CODE)也包含在GROUP BY子句中。
正确的查询语句如下:
SELECT f.PAR_FAULT_CODE AS "parFaultCode",
f.FAULT_NAME AS "faultName",
COALESCE(r.REPORT_DEPT_CODE, 'N/A') AS "reportDeptCode",
COUNT(r.REPORT_DEPT_CODE) AS "report",
(SELECT COUNT(*) FROM FAULT_REPORT d WHERE d.FAULT_CODE = f.FAULT_CODE) AS "reportCount"
FROM FAULT_TYPE f
LEFT JOIN FAULT_REPORT r ON f.FAULT_CODE = r.FAULT_CODE
GROUP BY f.PAR_FAULT_CODE, f.FAULT_NAME, COALESCE(r.REPORT_DEPT_CODE, 'N/A'), f.FAULT_CODE
ORDER BY f.PAR_FAULT_CODE, f.FAULT_NAME
阅读全文