Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 选择带有左外部联接的查询和带有分组依据的求和_Mysql_Sql_Oracle_Left Join - Fatal编程技术网

Mysql 选择带有左外部联接的查询和带有分组依据的求和

Mysql 选择带有左外部联接的查询和带有分组依据的求和,mysql,sql,oracle,left-join,Mysql,Sql,Oracle,Left Join,例如,我有3张桌子 父表:测试摘要 子表:测试详情、测试详情2 我有数据显示在图像中,并希望输出结果显示在图像中 我尝试了下面2个查询,但没有给出预期的输出 SELECT s.NAME, sum(s.AMT), sum(d.d_amt), sum(d2.d2_amt) FROM TEST_SUMMARY s LEFT OUTER JOIN TEST_DETAIL d ON s.ID = d.SUMMARY_ID LEFT OUTER JOIN TEST_DETAIL2 d2 ON s.ID

例如,我有3张桌子

父表:测试摘要

子表:测试详情、测试详情2

我有数据显示在图像中,并希望输出结果显示在图像中

我尝试了下面2个查询,但没有给出预期的输出

SELECT s.NAME, sum(s.AMT), sum(d.d_amt), sum(d2.d2_amt)
FROM TEST_SUMMARY s LEFT OUTER JOIN TEST_DETAIL d
ON s.ID = d.SUMMARY_ID 
LEFT OUTER JOIN TEST_DETAIL2 d2
ON s.ID =d2.SUMMARY_ID
GROUP BY s.NAME
ORDER BY s.NAME;

select rs1.*,rs2.total1,rs3.total2
FROM
(select id, name,amt from TEST_SUMMARY a) RS1,
(select SUMMARY_ID, sum(d_amt) over(partition by summary_id ) total1 from TEST_DETAIL a) RS2,
(select SUMMARY_ID, sum(d2_amt) over(partition by summary_id ) total2 from TEST_DETAIL2 a) RS3
where rs1.id(+)= RS2.SUMMARY_ID
and rs1.id(+)= RS3.SUMMARY_ID;
创建表并插入数据测试查询

CREATE TABLE TEST_SUMMARY(ID NUMBER, NAME VARCHAR2(20 BYTE),AMT  NUMBER(10,2));

CREATE TABLE TEST_DETAIL (ID NUMBER, SUMMARY_ID NUMBER, NAME VARCHAR(20), D_AMT NUMBER(10,2));

CREATE TABLE TEST_DETAIL2 (ID NUMBER, SUMMARY_ID NUMBER, NAME VARCHAR(20), D2_AMT NUMBER(10,2));

INSERT INTO TEST_SUMMARY VALUES (1, 'NAME1', 100);
INSERT INTO TEST_SUMMARY VALUES (4, 'NAME1', 150);
INSERT INTO TEST_SUMMARY VALUES (6, 'NAME1', 50);
INSERT INTO TEST_SUMMARY VALUES (2, 'NAME2', 200);
INSERT INTO TEST_SUMMARY VALUES (3, 'NAME3', 300);

INSERT INTO TEST_DETAIL VALUES (1, 1, 'NAME11', 11);
INSERT INTO TEST_DETAIL VALUES (2, 1, 'NAME12', 12);

INSERT INTO TEST_DETAIL2 VALUES (1, 1, 'NAME_2_11', 1);
INSERT INTO TEST_DETAIL2 VALUES (2, 1, 'NAME_2_12', 1);
试试这个:

  SELECT TS.NAME, TS.AMT AS AMT1, SUM(TD.D_AMT) AS AMT2, SUM(TD2.D2_AMT) AS AMT3
    FROM TEST_SUMMARY TS LEFT OUTER JOIN TEST_DETAIL TD   ON TS.ID = TD.SUMMARY_ID
                         LEFT OUTER JOIN TEST_DETAIL2 TD2 ON TS.ID = TD2.SUMMARY_ID
GROUP BY TS.NAME, TS.AMT
ORDER BY TS.NAME, TS.AMT
试试这个:

  SELECT TS.NAME, TS.AMT AS AMT1, SUM(TD.D_AMT) AS AMT2, SUM(TD2.D2_AMT) AS AMT3
    FROM TEST_SUMMARY TS LEFT OUTER JOIN TEST_DETAIL TD   ON TS.ID = TD.SUMMARY_ID
                         LEFT OUTER JOIN TEST_DETAIL2 TD2 ON TS.ID = TD2.SUMMARY_ID
GROUP BY TS.NAME, TS.AMT
ORDER BY TS.NAME, TS.AMT
你可以试试这个:

SELECT
    TEST_SUMMARY.NAME,
    TEST_SUMMARY.AMT AS AMT1,
    (
        SELECT
            SUM(TEST_DETAIL.D_AMT)
        FROM
            TEST_DETAIL
        WHERE
            TEST_DETAIL.SUMMARY_ID=TEST_SUMMARY.ID
    ) AS AMT2,
    (
        SELECT
            SUM(TEST_DETAIL2.D2_AMT)
        FROM
            TEST_DETAIL2
        WHERE
            TEST_DETAIL2.SUMMARY_ID=TEST_SUMMARY.ID
    ) AS AMT3
FROM
    TEST_SUMMARY
更新

如果你有许多相同的名字,你基本上可以这样做。但是问题来了,您应该如何处理其他字段(AMT1、AMT2)?你应该为同一个名字求和,或者一个最大值就足够了。取决于您的要求:

SELECT
    TEST_SUMMARY.NAME,
    SUM(TEST_SUMMARY.AMT) AS AMT,
    SUM(tblAMT2.AMT2) AS AMT2,
    SUM(tblAMT3.AMT3) AS AMT3
FROM
    TEST_SUMMARY
    LEFT JOIN
    (
        SELECT
            SUM(TEST_DETAIL.D_AMT) AS AMT2,
            TEST_DETAIL.SUMMARY_ID
        FROM
            TEST_DETAIL
        GROUP BY
            TEST_DETAIL.SUMMARY_ID
    ) AS tblAMT2
        ON TEST_SUMMARY.ID=tblAMT2.SUMMARY_ID
    LEFT JOIN
    (
        SELECT
            SUM(TEST_DETAIL2.D2_AMT) AS AMT3,
            TEST_DETAIL2.SUMMARY_ID
        FROM
            TEST_DETAIL2
        GROUP BY
            TEST_DETAIL2.SUMMARY_ID
    ) AS tblAMT3
        ON TEST_SUMMARY.ID=tblAMT3.SUMMARY_ID
GROUP BY
    TEST_SUMMARY.NAME
你可以试试这个:

SELECT
    TEST_SUMMARY.NAME,
    TEST_SUMMARY.AMT AS AMT1,
    (
        SELECT
            SUM(TEST_DETAIL.D_AMT)
        FROM
            TEST_DETAIL
        WHERE
            TEST_DETAIL.SUMMARY_ID=TEST_SUMMARY.ID
    ) AS AMT2,
    (
        SELECT
            SUM(TEST_DETAIL2.D2_AMT)
        FROM
            TEST_DETAIL2
        WHERE
            TEST_DETAIL2.SUMMARY_ID=TEST_SUMMARY.ID
    ) AS AMT3
FROM
    TEST_SUMMARY
更新

如果你有许多相同的名字,你基本上可以这样做。但是问题来了,您应该如何处理其他字段(AMT1、AMT2)?你应该为同一个名字求和,或者一个最大值就足够了。取决于您的要求:

SELECT
    TEST_SUMMARY.NAME,
    SUM(TEST_SUMMARY.AMT) AS AMT,
    SUM(tblAMT2.AMT2) AS AMT2,
    SUM(tblAMT3.AMT3) AS AMT3
FROM
    TEST_SUMMARY
    LEFT JOIN
    (
        SELECT
            SUM(TEST_DETAIL.D_AMT) AS AMT2,
            TEST_DETAIL.SUMMARY_ID
        FROM
            TEST_DETAIL
        GROUP BY
            TEST_DETAIL.SUMMARY_ID
    ) AS tblAMT2
        ON TEST_SUMMARY.ID=tblAMT2.SUMMARY_ID
    LEFT JOIN
    (
        SELECT
            SUM(TEST_DETAIL2.D2_AMT) AS AMT3,
            TEST_DETAIL2.SUMMARY_ID
        FROM
            TEST_DETAIL2
        GROUP BY
            TEST_DETAIL2.SUMMARY_ID
    ) AS tblAMT3
        ON TEST_SUMMARY.ID=tblAMT3.SUMMARY_ID
GROUP BY
    TEST_SUMMARY.NAME

MySQL和Oracle解决此问题的一种方法是使用子查询来帮助您解决重复问题,方法是按名称聚合明细表中的总和,这样您就可以使用普通联接进行汇总

SELECT ts.name, SUM(ts.amt) amt1, MAX(td1.amt) amt2, MAX(td2.amt) amt3
FROM TEST_SUMMARY ts
LEFT JOIN (
  SELECT ts.name, SUM(td.d_amt) amt 
  FROM TEST_DETAIL td JOIN TEST_SUMMARY ts ON td.summary_id = ts.id
  GROUP BY ts.name) td1 ON ts.name = td1.name
LEFT JOIN (
  SELECT ts.name, SUM(td.d2_amt) amt 
  FROM TEST_DETAIL2 td JOIN TEST_SUMMARY ts ON td.summary_id = ts.id
  GROUP BY ts.name) td2 ON ts.name = td2.name
GROUP BY ts.name
ORDER BY ts.name

使用。

解决MySQL和Oracle问题的一种方法是使用子查询,通过按名称聚合明细表中的总和,帮助您解决重复问题,这样您就可以使用普通联接进行汇总

SELECT ts.name, SUM(ts.amt) amt1, MAX(td1.amt) amt2, MAX(td2.amt) amt3
FROM TEST_SUMMARY ts
LEFT JOIN (
  SELECT ts.name, SUM(td.d_amt) amt 
  FROM TEST_DETAIL td JOIN TEST_SUMMARY ts ON td.summary_id = ts.id
  GROUP BY ts.name) td1 ON ts.name = td1.name
LEFT JOIN (
  SELECT ts.name, SUM(td.d2_amt) amt 
  FROM TEST_DETAIL2 td JOIN TEST_SUMMARY ts ON td.summary_id = ts.id
  GROUP BY ts.name) td2 ON ts.name = td2.name
GROUP BY ts.name
ORDER BY ts.name


并使用进行测试。

这并没有给出预期的结果,因为遗漏了汇总表所需的联接,所有记录都应该来自汇总表。您执行了我的查询吗?这看起来正确@Rahul。Ahmet,你能解释一下为什么这个答案吗?因为,@RahulAgrawal的查询对TEST_SUMMARY.AMT字段求和。我想,这会导致错误的结果。是的,但我想求和(TEST\u SUMMARY.AMT),因为TEST\u SUMMARY可以有多个AMT用于同一个名称。更新的查询未给出正确的结果。我已经执行了。这并没有给出预期的结果,因为遗漏了汇总表所需的联接,所有记录都应该来自汇总表。您执行了我的查询吗?这看起来是正确的@Rahul。Ahmet,你能解释一下为什么这个答案吗?因为,@RahulAgrawal的查询对TEST_SUMMARY.AMT字段求和。我想,这会导致错误的结果。是的,但我想求和(TEST\u SUMMARY.AMT),因为TEST\u SUMMARY可以有多个AMT用于同一个名称。更新的查询未给出正确的结果。我已经执行了。这是MySQL还是Oracle?不能两者都是。它应该对两者都有效。@shree.pat18这是OracleMySQL还是Oracle?不能两者都是。它应该对两者都有效。@shree.pat18它是OracleThis看起来没问题,这个查询的唯一问题是sum(TEST_SUMMARY.AMT),你能提出一些建议吗?你提供的数据表明不需要它。你测试过了吗?或者您是否有更多问题中未提供的数据?这是示例表和测试数据,我在问题中提供了,由于某些策略,我无法提供实际的域表。但实际数据在汇总表中有多个相同名称的金额。所以需要求和。@RahulAgrawal:更新answer@RahulAgrawal:您提供的链接。这看起来没问题,这个查询的唯一问题是sum(TEST_SUMMARY.AMT),你能为它提供一些建议吗?你提供的数据表明它是不需要的。你测试过了吗?或者您是否有更多问题中未提供的数据?这是示例表和测试数据,我在问题中提供了,由于某些策略,我无法提供实际的域表。但实际数据在汇总表中有多个相同名称的金额。所以需要求和。@RahulAgrawal:更新answer@RahulAgrawal:您提供的链接。是的,它给出了预期的结果。谢谢关于如何实现MYSQL数据库的相同功能,您有什么想法或建议吗?@RahulAgrawal更新了一个同时适用于MYSQL和Oracle的查询。谢谢!!,希望这不会有性能损失,因为在详细的表格中,我们可能有大约200万条记录,这给出了预期的结果。谢谢关于如何实现MYSQL数据库的相同功能,您有什么想法或建议吗?@RahulAgrawal更新了一个同时适用于MYSQL和Oracle的查询。谢谢!!,希望这不会有性能损失,因为在详细的表格中,我们可能有大约200万条记录