Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.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
Sql 使用In从第二个查询中提取结果_Sql - Fatal编程技术网

Sql 使用In从第二个查询中提取结果

Sql 使用In从第二个查询中提取结果,sql,Sql,我有一个存储发票详细信息的数据库。正如您所期望的,发票的每个细节都列在数据库中。一些示例信息: Invoice# Service_Type Detail_Code 1234 1 AB 1234 2 DF 1234 5 ER 1235 1 AB 1236 1

我有一个存储发票详细信息的数据库。正如您所期望的,发票的每个细节都列在数据库中。一些示例信息:

Invoice#     Service_Type    Detail_Code
1234            1               AB
1234            2               DF
1234            5               ER
1235            1               AB
1236            1               AB
1236            2               DF
1237            1               AB
1238            1               AB
1239            1               AB
1239            3               DZ
我想写一个查询来计算客户的服务类型为“1”且没有DZ或DF详细代码的服务数量。所以在这种情况下,我的查询结果是:

"3"
它将计算发票号码:

1235
1237
1238
我不太明白。我的问题是:

SELECT Invoice_Number
FROM Invoice_Detail_Tb
WHERE (Invoice_Number IN (SELECT Invoice_Number
                          FROM Invoice_Detail_Tb AS Invoice_Detail_Tb_1
                          WHERE (Service_type = '1')
                            AND (Invoice_Date BETWEEN @startdate AND @enddate)
                            AND (Store_Number = @storenumber)))
  AND (Detail_Code NOT IN ('DF', 'DZ'))

当我运行这个查询时,我不断得到“6”,这是服务类型为“1”的服务总数。我遗漏了什么?

一种方法是使用
而不是

SELECT Invoice_Number
FROM  Invoice_Detail_Tb
where service_type = '1'
EXCEPT
SELECT Invoice_Number
FROM  Invoice_Detail_Tb
where Detail_Code IN ('DF', 'DZ')
因为除了
,您不能使用
,所以可以使用
不存在


使用DISTINCT时,获取唯一发票号可能非常简单:

SELECT DISTINCT
    Invoice_Number
FROM  Invoice_Detail_Tb
WHERE
    Service_type = '1'
    and Detail_Code NOT IN ('DF', 'DZ')
    and Invoice_Date BETWEEN @startdate AND @enddate 
    and Store_Number = @storenumber
至于计数服务:

SELECT 
    Invoice_Number,
    count(*) as services_Count
FROM  Invoice_Detail_Tb
WHERE
    Service_type = '1'
    and Detail_Code NOT IN ('DF', 'DZ')
    and Invoice_Date BETWEEN @startdate AND @enddate 
    and Store_Number = @storenumber
GROUP BY Invoice_Number

我尝试过使用“Except”,但它是SQL的旧版本,在使用“Except”时遇到了“不受支持的”异常,这不是它处理类似这样的“detail”表的方式。它将返回所有结果,其中包含“service_type'1'”我的内部子查询中的错误、遗漏的条件。更改了答案。如果您运行该查询,它仍然返回服务类型为1的所有结果。我无法对实际数据运行查询以查看结果,因此您应该选中
@startdate
@enddate
@storenumber
用于筛选结果的参数值-概率范围变得非常广泛,似乎所有可能的服务类型都返回了1。
SELECT 
    Invoice_Number,
    count(*) as services_Count
FROM  Invoice_Detail_Tb
WHERE
    Service_type = '1'
    and Detail_Code NOT IN ('DF', 'DZ')
    and Invoice_Date BETWEEN @startdate AND @enddate 
    and Store_Number = @storenumber
GROUP BY Invoice_Number