2015-11-18 91 views
0

我有一个sqlite子查询,下面的查询是计算小时和labour_rate。我现在唯一的问题是我可以从我的子查询中获取两列以输出主查询。我试图根据一些网站的教程来布置查询,但需要的帮助,有点让我过了终点线,我不断收到一个语法错误sqlite返回子查询多列

SELECT c.customerID, c.customer, sum(ifnull(il.line_price, 0))/10000 AS net, 
    FROM customer AS c 
    LEFT JOIN invoice AS i 
    ON c.customerID = i.customerID 
    LEFT JOIN invoice_line AS il 
    ON i.invoiceID = il.invoiceID 
    (SELECT sum((ifnull(tl.mon,0) + ifnull(tl.tues,0) + ifnull(tl.wed,0) + ifnull(tl.thurs,0) + ifnull(tl.fri,0) + ifnull(tl.sat,0) + ifnull(tl.sun,0)) * s.cost_rate)/10000 AS labour_rate, 
    sum((ifnull(tl.mon,0) + ifnull(tl.tues,0) + ifnull(tl.wed,0) + ifnull(tl.thurs,0) + ifnull(tl.fri,0) + ifnull(tl.sat,0) + ifnull(tl.sun,0)))/10000 AS 
    FROM timesheet_line AS tl 
    LEFT JOIN timesheet AS t 
    ON tl.timesheetID = t.timesheetID 
    LEFT JOIN staff AS s 
    ON t.staffID = s.staffID 
    WHERE (c.customerID = tl.customerID) AND (t.date BETWEEN '2014-03-01' AND '2015-12-01') 
    GROUP BY tl.customerID) AS time1 
    WHERE (i.date BETWEEN '2014-03-01' AND '2015-12-01') AND (time1.customerID = tl.customerID) 
    GROUP BY c.customerID 
    ORDER BY c.customer ASC 

回答

1

中有几个语法错误这里。第一个(也可能是最重要的)是你必须将子查询JOIN分配给结果集的其余部分。所以经过

LEFT JOIN invoice_line AS il 
    ON i.invoiceID = il.invoiceID 

你将需要添加另一个JOIN语句:

LEFT JOIN 
    (SELECT 
     SUM(...) AS labour_rate, 
     SUM(...) AS hours, 
     tl.customerID 
    FROM 
    ...) AS time1 
ON <your join condition> 

你会在你的子查询中选择一些排序字段,你可以加入回发票上即tl.customerID 。 另外,在你的子查询中,你不能引用它之外的字段,所以当你的子查询中有WHERE (c.customerID = tl.customerID)时,它会失败,因为你试图引用c.<fieldname>。它需要移至JOIN子句的ON部分。一旦你的JOIN正常工作,那么你可以改变你的最外层SELECT喜欢的东西

SELECT c.customerID, c.customer, sum(ifnull(il.line_price,0))/10000 AS net, time1.labour_rate, time1.hours 

这里是我会怎么做一个例子:

SELECT c.customerID, c.customer, sum(ifnull(il.line_price, 0))/10000 AS net, time1.labour_rate, time1.[hours] 
FROM customer AS c 
    LEFT JOIN invoice AS i 
    ON c.customerID = i.customerID 
    LEFT JOIN invoice_line AS il 
    ON i.invoiceID = il.invoiceID 
    LEFT JOIN 
     (SELECT 
      sum((ifnull(tl.mon,0) + ifnull(tl.tues,0) + ifnull(tl.wed,0) + ifnull(tl.thurs,0) + ifnull(tl.fri,0) + ifnull(tl.sat,0) + ifnull(tl.sun,0)) * s.cost_rate)/10000 AS labour_rate, 
      sum((ifnull(tl.mon,0) + ifnull(tl.tues,0) + ifnull(tl.wed,0) + ifnull(tl.thurs,0) + ifnull(tl.fri,0) + ifnull(tl.sat,0) + ifnull(tl.sun,0)))/10000 AS [hours], 
      tl.customerID 
     FROM timesheet_line AS tl 
      LEFT JOIN timesheet AS t 
      ON tl.timesheetID = t.timesheetID 
      LEFT JOIN staff AS s 
      ON t.staffID = s.staffID 
     WHERE (t.date BETWEEN '2014-03-01' AND '2015-12-01') 
     GROUP BY tl.customerID) AS time1 
    ON c.customerID = time1.customerID 
WHERE (i.date BETWEEN '2014-03-01' AND '2015-12-01') 
GROUP BY c.customerID 
ORDER BY c.customer ASC 
+0

非常感谢您的回答更重要的是你的解释。你已经解释得非常好,实际上已经沉入其中。希望我可以添加另一个子查询来计算来自其他表集的其他成本,以获得最终的输出结果。 – JK36