我发现很难在标题中说出我想做的事情,所以我会尽力解释吧!
我正在使用两张桌子:
Master_Tab and Parts_Tab
Parts_Tab具有以下信息:
Order_Number | Completed| Part_Number|
| 1 | Y | 64 |
| 2 | N | 32 |
| 3 | Y | 42 |
| 1 | N | 32 |
| 1 | N | 5 |
Master_Tab有以下信息:
Order_Number|
1 |
2 |
3 |
4 |
5 |
我想生成一个查询,它将在以下条件下返回Master_Tab中列出的所有Order_Numbers ...
对于每个Order_Number,我想检查Parts_Tab表以查看是否有任何不完整的部分(Completed ='N')。对于每个Order_Number,我想计算一个订单对它的未完成部分的数量。如果Order_Number没有未完成的部分或者它不在Parts_Table中,那么我希望计数值为0.
因此,生成的表格如下所示:
Order_Number | Count_of_Non_Complete_Parts|
1 | 2 |
2 | 1 |
3 | 0 |
4 | 0 |
5 | 0 |
我希望在桌面上使用不同类型的连接可以做到这一点,但我显然错过了这个技巧!
非常感谢任何帮助!
感谢。
答案 0 :(得分:2)
我已经使用COALESCE
在必要时将NULL转换为零。根据您的数据库平台,您可能需要使用其他方法,例如ISNULL
或CASE
。
select mt.Order_Number,
coalesce(ptc.Count, 0) as Count_of_Non_Complete_Parts
from Master_Tab mt
left outer join (
select Order_Number, count(*) as Count
from Parts_Tab
where Completed = 'N'
group by Order_Number
) ptc on mt.Order_Number = ptc.Order_Number
order by mt.Order_Number
答案 1 :(得分:1)
您正在寻找LEFT JOIN
。
SELECT mt.order_number, count(part_number) AS count_noncomplete_parts
FROM master_tab mt LEFT JOIN parts_tab pt
ON mt.order_number=pt.order_number AND pt.completed='N'
GROUP BY mt.order_number;
也可以将pt.completed='N'
放入WHERE子句中,但是必须小心NULL。而不是AND
你可以拥有
WHERE pt.completed='N' OR pr.completed IS NULL
答案 2 :(得分:1)
SELECT mt.Order_Number SUM(tbl.Incomplete) Count_of_Non_Complete_Parts
FROM Master_Tab mt
LEFT JOIN (
SELECT Order_Number, CASE WHEN Completed = 'N' THEN 1 ELSE 0 END Incomplete
FROM Parts_Tab
) tbl on mt.Order_Number = tbl.Order_Number
GROUP BY mt.Order_Number
如果需要过滤特定的订单号,请在外部查询中添加WHERE
子句。
答案 3 :(得分:0)
我认为在那里获得子查询是最容易的。如果不随意提出任何问题,我认为这应该是自我解释的。
CREATE TABLE #Parts
(
Order_Number int,
Completed char(1),
Part_Number int
)
CREATE TABLE #Master
(
Order_Number int
)
INSERT INTO #Parts
SELECT 1, 'Y', 64 UNION ALL
SELECT 2, 'N', 32 UNION ALL
SELECT 3, 'Y', 42 UNION ALL
SELECT 1, 'N', 32 UNION ALL
SELECT 1, 'N', 5
INSERT INTO #Master
SELECT 1 UNION ALL
SELECT 2 UNION ALL
SELECT 3 UNION ALL
SELECT 4 UNION ALL
SELECT 5 UNION ALL
SELECT 6
SELECT M.Order_Number, ISNULL(Totals.NonCompletedCount, 0) FROM #Master M
LEFT JOIN (SELECT P.Order_Number, COUNT(*) AS NonCompletedCount FROM #Parts P
WHERE P.Completed = 'N'
GROUP BY P.Order_Number) Totals ON Totals.Order_Number = M.Order_Number