2010-07-15 2 views
1

Вот моя проблема. Я создаю 4 временных таблицы для подсчета конкретных типов ящиков и часов сотрудника. Учитывая начальную дату и дату окончания, мы хотим знать полные ящики каждого типа (1, 2 и 3) и их общее количество часов работы в этот период времени. Все работает отлично, если есть хотя бы один из каждого типа, но если присутствуют только два типа, я получаю пустой результат для всего окончательного оператора SELECT.Может ли SELECT из одной пустой таблицы temp в SQL привести к тому, что результаты будут пустыми?

Итак, может ли инструкция SELECT, содержащая пустую таблицу temp в строке FROM, заставить все остальное возвращать пустое?

Например, диапазон дат от 6-1-10 до 6-10-10 возвращает 10 ящиков типа 1, 12 ящиков типа 2, 0 типов 3 и 36 часов, но результат отображается пустым. Но если он продлевается один день и включены 15 типов 3, запрос работает.

SELECT Count(isnull(Box_Num,0)) as Box1, emp_num INTO #Box1 
FROM TEST.dbo.Prod_beta2 
WHERE BoxType like '1' and time > '06/01/10' + ' 12:01 AM' and time < '06/10/10' + ' 11:59pm' and emp_num like '10467' 
group by emp_num 


SELECT Count(isnull(Box_Num,0)) as Box2, emp_num INTO #Box2 
FROM TEST.dbo.Prod_beta2 
WHERE BoxType like '2' and time > '06/01/10' + ' 12:01 AM' and time < '06/10/10' + ' 11:59pm' and emp_num like '10467' 
group by emp_num 


SELECT count(isnull(box_num,0)) as Box3, emp_num INTO #Box3 
from TEST.dbo.Prod_beta2 
WHERE BoxType like '3' and time > '06/01/10' + ' 12:01 AM' and time < '06/10/10' + ' 11:59pm' and emp_num like '10467' 
group by emp_num 


SELECT SUM(HOURS) as TotalHours, empid INTO #Hours 
FROM TEST.dbo.Timeclock 
where timein > '06/01/10' + ' 12:01 AM' and timein < '06/10/10' + ' 11:59pm' and empid like '10467' 
group by empid 


SELECT Box1, Box2, Box3, TotalHours 
FROM #Box1, #Box2, #Box3, #Hours 


DROP TABLE #Box1, #Box2, #Box3, #Hours 
+1

Почему вы создаете все эти временные таблицы, когда вы могли бы просто заполнить @variables и затем вернуть их? – DOK

+0

«empid» и «empnum» одинаковые значения? Если это так, это можно сделать с помощью одного запроса (и без временных таблиц). Вы понимаете, что без каких-либо критериев соединения «SELECT Box1, Box2, Box3, TotalHours FROM # Box1, # Box2, # Box3, # Hours' производят [декартово произведение] (http://www.codinghorror.com/blog/ 2007/10/а-зрительно-объяснение-оф-SQL-joins.html)? –

ответ

2

Да. Вы делаете декартовский продукт, что означает, что в результате вы получите строки B1 * B2 * B3 * H.

Когда у B3 нет строк, вы, очевидно, умножаетесь на ноль.

Первые три из ваших условий могут быть легко объединены (кстати, какой тип данных BoxType и emp_num? Если они являются числовыми, то не используйте строки, чтобы избежать ненужных проблем с преобразованием типов. похоже, что-то пропустит с 23:59 до 12:01 AM. Это намеренно? Кроме того, вы должны, вероятно, использовать форматы даты ISO, чтобы избежать каких-либо проблем, если вы когда-либо меняете серверы и т. д.)

SELECT 
Count(CASE WHEN BoxType = '1' THEN 1 ELSE NULL END) as Box1, 
Count(CASE WHEN BoxType = '2' THEN 1 ELSE NULL END) as Box2, 
Count(CASE WHEN BoxType = '3' THEN 1 ELSE NULL END) as Box3 
FROM TEST.dbo.Prod_beta2 
WHERE BoxType in ('1','2','3') and time > '06/01/10' + ' 12:01 AM' and 
    time < '06/10/10' + ' 11:59pm' and emp_num like '10467' 
group by emp_num 
+1

Вы были правы. Я добавил утверждения объединения, чтобы исключить умножение на ноль и работает как шарм. благодаря –

0

Если поля все же типа, то вы не должны делать это так:

SELECT Box1, Box2, Box3, TotalHours 
FROM #Box1, #Box2, #Box3, #Hours 

Вы должны использовать UNION ALL запрос

Как так:

SELECT Count(isnull(Box_Num,0)) as Box1, emp_num 
    FROM TEST.dbo.Prod_beta2 
    WHERE BoxType like '1' and time > '06/01/10' + ' 12:01 AM' and time < '06/10/10' + ' 11:59pm' and emp_num like '10467' 
    UNION ALL 
    SELECT Count(isnull(Box_Num,0)) as Box2, emp_num 
    FROM TEST.dbo.Prod_beta2 
    WHERE BoxType like '2' and time > '06/01/10' + ' 12:01 AM' and time < '06/10/10' + ' 11:59pm' and emp_num like '10467' 
    UNION ALL 

SELECT count(isnull(box_num,0)) as Box3, emp_num 
from TEST.dbo.Prod_beta2 
WHERE BoxType like '3' and time > '06/01/10' + ' 12:01 AM' and time < '06/10/10' + ' 11:59pm' and emp_num like '10467' 
group by emp_num 

Ваш последний выбор - единственное, что отличается, поэтому просто отделите этот запрос от числа o f отображаются.

Однако вам даже не нужны временные таблицы для этого, просто используйте стандартные инструкции SELECT и добавьте объединение всех к каждому из них.

Ваш текущий оператор будет давать 0 строк, если любой из этих запросов содержит 0 строк. Look into cartesian products and what they mean