SQL: запрос, чтобы проверить, соответствует ли столбец определенным критериям, выполняет ли он одно действие, если не выполняет другой - PullRequest
0 голосов
/ 28 сентября 2011

Мне было довольно сложно сказать, что я хочу сделать в названии, поэтому я постараюсь объяснить сейчас!

У меня есть две таблицы, которые я использую:

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           |

Я хочу сгенерировать запрос, который будет возвращать ВСЕ номера Order_Numbers, перечисленные в Master_Tab, при следующих условиях ...

Для каждого 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 ]

2 голосов
/ 28 сентября 2011

Я использовал 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 голос
/ 28 сентября 2011
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 к внешнему запросу, если вам нужно отфильтровать определенные номера заказов.

1 голос
/ 28 сентября 2011

Вы ищете 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
0 голосов
/ 28 сентября 2011

Я думаю, что там проще всего получить подзапрос.Я думаю, что это должно быть само собой разумеющимся, если не стесняйтесь задавать любые вопросы.

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
...