Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Ошибка в запросе  [new]
New_Frozen
Member

Откуда: Киев
Сообщений: 223
Подскажите пожалуйста. есть запрос
DECLARE @table_name  varchar(255)
DECLARE @column_ID  varchar(255)
 
SET @table_name = (SELECT distinct [name_sys]
 				   FROM [dbo].[Tables]
                   WHERE [name_usr]='#1 Table'
                   )
                   
SET @column_ID = (select [name_sys] from
                    COLUMNS c,  
                    (SELECT distinct [ID_Identificator] i
 				     FROM [dbo].[Tables]
                     WHERE [name_usr]= '#1 Table'
                     ) tab
                 where c.id=tab.i)
                 
/*Получаем количество полей, удовлетворяющих условиям и общее количество полей диапазона */
SELECT count(*) AS count,
       sum(CASE [D_C_to_W]
           when null then 0
           else 1
           END) as sum1, 
       sum(CASE [D_W_to_VS]
           when null then 1
           else 0
           END) as sum2    
	   FROM [PACKPRJ].[dbo].['+@table_name+'] tab
	   Where tab.'+@column_ID+' between 8938006220912121803 and 8938006220912121834

однако он выдает неверные результаты. Я подозревая, что я неправильно понимаю принцип работы или Case или Sum.

Я хочу чтобы мне выдало количество пустых(заполненных) строк по каждому из столбцов и общее количество. Такой запрос не возвращает правильный результат. Не подскажите в чем проблема.

При написании:
EXEC(' SELECT count(*) AS count
	   FROM [PACKPRJ].[dbo].['+@table_name+'] tab
	   Where tab.'+@column_ID+' between 8938006220912121803 and 8938006220912121834
       and [D_W_to_VS] is null')

все правильно считается
16 июн 09, 00:33    [7302895]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в запросе  [new]
Ё-МАЙО
Guest
CASE when isnull(D_W_to_VS,0) = 0 then 0 else 1
cast(isnull(D_W_to_VS,0) as bit)
...
16 июн 09, 00:50    [7302948]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в запросе  [new]
angel_zar
Member

Откуда: Барнаул
Сообщений: 901
Вы не правильно понимаете тип данных null
select 1
where null=null

select 1
where null<>null

Почитайте про null
16 июн 09, 06:21    [7303110]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в запросе  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Во-первых, непонятно, как можно писать так:
New_Frozen
FROM [PACKPRJ].[dbo].['+@table_name+'] tab
	   Where tab.'+@column_ID+' between 8938006220912121803 and 8938006220912121834
Это получается, динамический запрос нужен.
Во-вторых, CASEы в суммах можно написать так:
COUNT([D_C_to_W]) sum1,
COUNT(*)-COUNT([D_C_to_W]) sum2
16 июн 09, 08:57    [7303259]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в запросе  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
iap
CASEы в суммах можно написать так:
COUNT([D_C_to_W]) sum1,
COUNT(*)-COUNT([D_C_to_W]) sum2
Точнее, не CASEы в суммах, а сами суммы (количество не-NULLов и NULLов соответственно)
16 июн 09, 09:00    [7303262]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в запросе  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Вот так корректнее будет (кто его знает, есть ли квадратные скобки в именах таблиц и полей):
EXEC(' SELECT count(*) AS count
	   FROM [PACKPRJ].[dbo].'+QUOTENAME(@table_name)+' tab
	   Where tab.'+QUOTENAME(@column_ID)+' between 8938006220912121803 and 8938006220912121834
       and [D_W_to_VS] is null')
16 июн 09, 09:07    [7303281]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в запросе  [new]
New_Frozen
Member

Откуда: Киев
Сообщений: 223
Всем спасибо,

iap

COUNT([D_C_to_W]) sum1,
COUNT(*)-COUNT([D_C_to_W]) sum2
Там просто идут разные столбцы и соответственно таким образом получить сумму не удастся

Ё-МАЙО
получил то, что хотел спасибо!

Я просто только учусь нет времени взять нормальную книжку и почитать, чтобы не задавать такие глупые вопросы.
16 июн 09, 10:22    [7303511]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить