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