SQL:查询以检查列是否满足某些条件,如果它执行了一个操作,如果它不执行另一个操作

时间:2011-09-28 14:18:33

标签: sql sqlcommand join

我发现很难在标题中说出我想做的事情,所以我会尽力解释吧!

我正在使用两张桌子:

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               |

我希望在桌面上使用不同类型的连接可以做到这一点,但我显然错过了这个技巧!

非常感谢任何帮助!

感谢。

4 个答案:

答案 0 :(得分:2)

我已经使用COALESCE在必要时将NULL转换为零。根据您的数据库平台,您可能需要使用其他方法,例如ISNULLCASE

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