Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.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 来自多个联接表MSSQL的总和_Mysql_Sql Server_Join_Inner Join_Outer Join - Fatal编程技术网

Mysql 来自多个联接表MSSQL的总和

Mysql 来自多个联接表MSSQL的总和,mysql,sql-server,join,inner-join,outer-join,Mysql,Sql Server,Join,Inner Join,Outer Join,我正试图生成一份报告,根据多个表的动态计算显示未结清余额。当前,此报表是使用服务器端语言生成的,该语言运行查询、循环查询并对结果运行另一个查询。我的目标是在MSSQL中执行所有计算 以下是包含一些示例数据的表/列: 测试顺序表 orderid customerid serviceamount 1001 2001 75.00 1002 2002 85.00 1003 2001

我正试图生成一份报告,根据多个表的动态计算显示未结清余额。当前,此报表是使用服务器端语言生成的,该语言运行查询、循环查询并对结果运行另一个查询。我的目标是在MSSQL中执行所有计算

以下是包含一些示例数据的表/列:

测试顺序表

orderid    customerid   serviceamount
1001       2001                 75.00
1002       2002                 85.00
1003       2001                 25.00
1004       2003                 10.00
customerid    customername
2001          'Initech'
2002          'Dunder Mifflin'
2003          'Paper Street Soap Co'
orderitemid    orderid    itemamount
5001           1001            50.00
5002           1001           150.00
5003           1002            15.00
5004           1004           200.00
5005           1004           200.00
transactionid    orderid    amount
9001             1001        75.00
9002             1002        25.00
9003             1002        50.00
9004             1003        55.00
9005             1001        50.00
9006             1001       150.00
测试客户表

orderid    customerid   serviceamount
1001       2001                 75.00
1002       2002                 85.00
1003       2001                 25.00
1004       2003                 10.00
customerid    customername
2001          'Initech'
2002          'Dunder Mifflin'
2003          'Paper Street Soap Co'
orderitemid    orderid    itemamount
5001           1001            50.00
5002           1001           150.00
5003           1002            15.00
5004           1004           200.00
5005           1004           200.00
transactionid    orderid    amount
9001             1001        75.00
9002             1002        25.00
9003             1002        50.00
9004             1003        55.00
9005             1001        50.00
9006             1001       150.00
测试\u订单项目表

orderid    customerid   serviceamount
1001       2001                 75.00
1002       2002                 85.00
1003       2001                 25.00
1004       2003                 10.00
customerid    customername
2001          'Initech'
2002          'Dunder Mifflin'
2003          'Paper Street Soap Co'
orderitemid    orderid    itemamount
5001           1001            50.00
5002           1001           150.00
5003           1002            15.00
5004           1004           200.00
5005           1004           200.00
transactionid    orderid    amount
9001             1001        75.00
9002             1002        25.00
9003             1002        50.00
9004             1003        55.00
9005             1001        50.00
9006             1001       150.00
测试交易表

orderid    customerid   serviceamount
1001       2001                 75.00
1002       2002                 85.00
1003       2001                 25.00
1004       2003                 10.00
customerid    customername
2001          'Initech'
2002          'Dunder Mifflin'
2003          'Paper Street Soap Co'
orderitemid    orderid    itemamount
5001           1001            50.00
5002           1001           150.00
5003           1002            15.00
5004           1004           200.00
5005           1004           200.00
transactionid    orderid    amount
9001             1001        75.00
9002             1002        25.00
9003             1002        50.00
9004             1003        55.00
9005             1001        50.00
9006             1001       150.00
我期待的结果是:

orderid  customername           totalorder   totalpaid     balance
1001     'Initech'                  275.00      275.00        0.00
1002     'Dunder Mifflin'           100.00       75.00      -25.00
1003     'Initech'                   25.00       55.00       30.00
1004     'Paper Street Soap Co'     410.00        0.00     -410.00
以下是我提出的问题:

SELECT 
    o.orderid, c.customername, o.serviceamount,
    (o.serviceamount + SUM( i.itemamount )) AS totalorder,
    SUM( t.amount ) AS totalPaid,
    ( SUM( t.amount ) - (o.serviceamount + SUM( i.itemamount )) ) AS balance

FROM 
    test_order o
    INNER JOIN test_customer c ON o.customerID = c.customerID
    LEFT OUTER JOIN test_transaction t ON o.orderID = t.orderID
    LEFT OUTER JOIN test_orderitem i ON o.orderID = i.orderID

WHERE 
    1=1

GROUP BY 
     o.orderid, c.customername, o.serviceamount,
     o.serviceamount
结果如下:

orderid  customername           totalorder   totalpaid     balance
1001     'Initech'                  675.00      550.00     -125.00
1002     'Dunder Mifflin'           115.00       75.00      -40.00
1003     'Initech'                    null       55.00        null
1004     'Paper Street Soap Co'     410.00        null        null
我遇到的问题是: 1.test_orderitem中的记录是重复的,例如,对于订单1002,serviceamount为$85,而$15中只有一个orderitem,但是,totalorder计算为$115。我认为这个问题与连接迭代两次有关。 2. '当没有返回任何记录时(出于明显原因),将显示null。我还没有开始这方面的工作,因为我一直在MySQL中进行测试,我想在将其带回MSSQL之前解决连接问题

感谢您可能提供的任何帮助…

尝试一下:

SELECT
    summary.orderid,
    summary.customername,
    summary.totalorder,
    summary.totalpaid,
    summary.totalorder - summary.totalpaid AS balance
FROM
    (SELECT
        o.orderid,
        c.customername,
        (SELECT SUM(oi.itemamount) FROM test_orderitem oi WHERE oi.orderid = o.orderid) AS totalorder,
        (SELECT IFNULL(SUM(t.amount), 0) FROM test_transaction t WHERE t.orderid = o.orderid) AS totalpaid
    FROM
        test_order o,
        test_customer c
    WHERE
        o.customerid = c.customerid) summary

对于MS-SQL:在这里,只需将最终查询中的表名替换为您自己的表名

DECLARE @Test_Order TABLE (orderid int, customerid int, serviceamount money)
INSERT INTO @Test_Order(orderid,customerid,serviceamount)
SELECT 1001,2001,75.00 UNION ALL
SELECT 1002,2002,85.00 UNION ALL
SELECT 1003,2001,25.00 UNION ALL
SELECT 1004,2003,10.00

DECLARE @Test_Customer TABLE (customerid int, customername varchar(100))
INSERT INTO @Test_Customer(customerid,customername)
SELECT 2001,'Initech' UNION ALL
SELECT 2002,'Dunder Mifflin' UNION ALL
SELECT 2003,'Paper Street Soap Co'

DECLARE @Test_OrderItem TABLE (orderitemid int, orderid int, itemamount money)
INSERT INTO @Test_OrderItem (orderitemid, orderid, itemamount)
SELECT 5001,1001,50.00 UNION ALL
SELECT 5002,1001,150.00 UNION ALL
SELECT 5003,1002,15.00 UNION ALL
SELECT 5004,1004,200.00 UNION ALL
SELECT 5005,1004,200.00

DECLARE @Test_Transaction TABLE (transactionid int, orderid int, amount money)
INSERT INTO @Test_Transaction (transactionid, orderid, amount)
SELECT 9001,1001,75.00 UNION ALL
SELECT 9002,1002,25.00 UNION ALL
SELECT 9003,1002,50.00 UNION ALL
SELECT 9004,1003,55.00 UNION ALL
SELECT 9005,1001,50.00 UNION ALL
SELECT 9006,1001,150.00


SELECT O.orderid, 
       C.customername, 
       SUM(ISNULL(O.serviceamount,0)+ISNULL(I.itemamount,0)) AS totalorder, 
       SUM(ISNULL(T.amount,0)) AS totalpaid,
       (SUM(ISNULL(T.amount,0))) - (SUM(ISNULL(O.serviceamount,0)+ISNULL(I.itemamount,0))) as balance
FROM @Test_Customer C
JOIN @Test_Order O
   ON C.customerid=O.customerid
LEFT JOIN (SELECT orderid, SUM(itemamount) AS itemamount FROM @Test_OrderItem GROUP BY orderid) I
   ON O.orderid=I.orderid
LEFT JOIN (SELECT orderid, SUM(amount) AS amount FROM @Test_Transaction GROUP BY orderid) T
   ON O.orderid=T.orderid
GROUP BY O.orderid, C.customername
ORDER BY O.orderid, C.customername


谢谢,亚历克斯!此查询耗时1秒,返回89151行。乍一看,结果看起来很准确,尽管您的查询结果与@JiggsJedi之间存在差异。通过此查询帮助我提高了SQL查询技能-再次感谢。谢谢,@JiggsJedi!此查询耗时0秒,返回89140行。乍一看,结果看起来是准确的,尽管您的查询结果与@Alex之间存在差异。Alex和我的主要区别在于,他向客户做了一个左连接,而我做了一个连接。Alex的查询将返回不存在客户记录的行,而我的查询则不存在。我还在orderid/customer上分组,而他不是——我的将把重复的订单平铺成一行。谢谢你的解释。。。我从你的询问和其他信息中学到了很多。干杯谢谢你发布这个。我可以稍微使用它,它返回了有用的数据,但是运行了相当长的时间。根据我的计算,处理每条记录大约需要0.025秒。