Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.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中的单个查询中选择多个计数_Sql_Database_Select_Count_Nested - Fatal编程技术网

试图在MySQL中的单个查询中选择多个计数

试图在MySQL中的单个查询中选择多个计数,sql,database,select,count,nested,Sql,Database,Select,Count,Nested,我有一张商店订单表。这些订单具有一个布尔属性,该属性说明它们是否需要交付给客户。还有一个表格说明订单是否完整 我想计算已交付发票的数量、剩余发票的数量,然后计算已完成付款的发票总数 这就是我迄今为止所做的尝试: SELECT COUNT(SELECT INVOICE_ID FROM INVOICE_LINE AS I, INVOICE_COMPLETE AS IC WHERE TO_DELIVER = 1 AND I.INVOICE_ID = IC.INVOICE_ID AND IC.

我有一张商店订单表。这些订单具有一个布尔属性,该属性说明它们是否需要交付给客户。还有一个表格说明订单是否完整

我想计算已交付发票的数量、剩余发票的数量,然后计算已完成付款的发票总数

这就是我迄今为止所做的尝试:

SELECT 
    COUNT(SELECT INVOICE_ID FROM INVOICE_LINE AS I, INVOICE_COMPLETE AS IC WHERE TO_DELIVER = 1 AND I.INVOICE_ID = IC.INVOICE_ID AND IC.COMPLETE = 1) AS DELIVERED, 
    COUNT(SELECT INVOICE_ID FROM INVOICE_LINE AS I, INVOICE_COMPLETE AS IC WHERE TO_DELIVER = 0 AND I.INVOICE_ID = IC.INVOICE_ID AND IC.COMPLETE = 1) AS REMAINING,
    COUNT(INVOICE_ID) AS TOTAL
FROM INVOICE_LINE AS I, INVOICE_COMPLETE AS IC
WHERE TO_DELIVER = 1
AND I.INVOICE_ID = IC.INVOICE_ID
这会引发以下语法错误:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT INVOICE_ID FROM INVOICE_LINE AS I, INVOICE_COMPLETE AS IC WHERE TO_DELIVE' at line 2

我哪里出了问题。这是我第一次尝试这样嵌套语句。

有一种更简单的方法:外部连接发票\u完成并计数匹配项:

SELECT 
  COUNT(IC.INVOICE_ID) AS DELIVERED, 
  COUNT(*) - COUNT(IC.INVOICE_ID) AS REMAINING,
  COUNT(*) AS TOTAL
FROM INVOICE_LINE AS I
LEFT JOIN INVOICE_COMPLETE AS IC ON I.INVOICE_ID = IC.INVOICE_ID AND IC.COMPLETE = 1
WHERE TO_DELIVER = 1;
编辑:嗯,我还应该解释一下你做错了什么:Count需要*、一列或一个表达式。对于列或表达式,它将统计非空出现次数,对于*它统计记录。您可以使用select语句作为表达式,但它必须有额外的括号,并且必须包含from子句:select COUNT select x from y from


最后一个建议是:使用显式连接语法INNER join x ON…,LEFT join y ON…,等等,而不是只列出带有逗号的表。这增强了可读性并有助于避免错误。

您可以按如下方式编写:

declare @toDeliver as int = (SELECT COUNT(INVOICE_ID) FROM INVOICE_LINE AS I, INVOICE_COMPLETE      AS IC WHERE TO_DELIVER = 0 AND I.INVOICE_ID = IC.INVOICE_ID AND IC.COMPLETE = 1)
declare @deliverd as int = (SELECT COUNT(INVOICE_ID) FROM INVOICE_LINE AS I, INVOICE_COMPLETE AS    IC WHERE TO_DELIVER = 1 AND I.INVOICE_ID = IC.INVOICE_ID AND IC.COMPLETE = 1) 
SELECT 
    @toDeliver as REMAINING, 
    @delivered as DELIVERED,
    @toDeliver + @delivered AS TOTAL

其他答案为您提供了更好的方法

但是错误似乎来自count函数内部的subselect

此更改可能适用于您:

    SELECT 
    (SELECT COUNT(INVOICE_ID) FROM INVOICE_LINE AS I, INVOICE_COMPLETE AS IC WHERE TO_DELIVER = 1 AND I.INVOICE_ID = IC.INVOICE_ID AND IC.COMPLETE = 1) AS DELIVERED, 
    (SELECT COUNT(INVOICE_ID) FROM INVOICE_LINE AS I, INVOICE_COMPLETE AS IC WHERE TO_DELIVER = 0 AND I.INVOICE_ID = IC.INVOICE_ID AND IC.COMPLETE = 1) AS REMAINING,
    COUNT(INVOICE_ID) AS TOTAL
FROM INVOICE_LINE AS I, INVOICE_COMPLETE AS IC
WHERE TO_DELIVER = 1
AND I.INVOICE_ID = IC.INVOICE_ID
这只是将计数移动到子选择中

或在子选项周围添加括号:

SELECT 
    COUNT((SELECT INVOICE_ID FROM INVOICE_LINE AS I, INVOICE_COMPLETE AS IC WHERE TO_DELIVER = 1 AND I.INVOICE_ID = IC.INVOICE_ID AND IC.COMPLETE = 1)) AS DELIVERED, 
    COUNT((SELECT INVOICE_ID FROM INVOICE_LINE AS I, INVOICE_COMPLETE AS IC WHERE TO_DELIVER = 0 AND I.INVOICE_ID = IC.INVOICE_ID AND IC.COMPLETE = 1)) AS REMAINING,
    COUNT(INVOICE_ID) AS TOTAL
FROM INVOICE_LINE AS I, INVOICE_COMPLETE AS IC
WHERE TO_DELIVER = 1
AND I.INVOICE_ID = IC.INVOICE_ID
;

你能解释一下左连接发生了什么吗?是的。从A.x=B.y的左侧连接B中选择*。如果存在与A.x匹配的连接,则与正常连接一样。但是,如果A.x没有匹配项,则A记录与空B记录连接。例如,B字段为空,B.y为空。我只是注意到我的select语句不正确。我过去和现在都对id.complete和to_deliver感到困惑。交付属于表发票行吗?你算什么:交付,完成=>1,1=交付,0,1=剩余,*,*=总计?还是1,*=总数?或*,1=总数?