Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Подставить значение 0 если нет данных во второй таблице  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Alibek B.
Отключенные мозги — вот это смешно.
А указанная рекомендация — это логично.

вы бесполезны
6 июн 18, 11:40    [21472072]     Ответить | Цитировать Сообщить модератору
 Re: Подставить значение 0 если нет данных во второй таблице  [new]
Посетитель
Member

Откуда:
Сообщений: 1209
Alibek B.
это логично.


шо ж вы сразу с козырей то?
может, есть таки разумное объяснение, чем в данном конкретном случае один вариант "логичен", а второй - нет?
6 июн 18, 11:41    [21472079]     Ответить | Цитировать Сообщить модератору
 Re: Подставить значение 0 если нет данных во второй таблице  [new]
Alibek B.
Member

Откуда:
Сообщений: 3588
Посетитель
может, есть таки разумное объяснение, чем в данном конкретном случае один вариант "логичен", а второй - нет?

В одном случае isnull применяется ко всем значениям группы, в другом случае isnull применяется только один раз в группе.
6 июн 18, 11:55    [21472141]     Ответить | Цитировать Сообщить модератору
 Re: Подставить значение 0 если нет данных во второй таблице  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Alibek B.
Посетитель
может, есть таки разумное объяснение, чем в данном конкретном случае один вариант "логичен", а второй - нет?

В одном случае isnull применяется ко всем значениям группы, в другом случае isnull применяется только один раз в группе.

по вашему "логично" получать всегда сумму 0 когда есть хоть один NULL для необязательного параметра выборки? Чем хуже ваша логика, тем интереснее следствия :)
6 июн 18, 11:59    [21472156]     Ответить | Цитировать Сообщить модератору
 Re: Подставить значение 0 если нет данных во второй таблице  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Alibek B.
Посетитель
может, есть таки разумное объяснение, чем в данном конкретном случае один вариант "логичен", а второй - нет?

В одном случае isnull применяется ко всем значениям группы, в другом случае isnull применяется только один раз в группе.
В каком случае результат функции SUM() будет равен NULL?
Что будет, если некоторые из слагаемых в SUM() будут равны NULL?
6 июн 18, 11:59    [21472158]     Ответить | Цитировать Сообщить модератору
 Re: Подставить значение 0 если нет данных во второй таблице  [new]
Alibek B.
Member

Откуда:
Сообщений: 3588
iap
Что будет, если некоторые из слагаемых в SUM() будут равны NULL?

null при суммировании игнорируется. Если все слагаемые null, то и сумма будет null. В этом случае isnull(sum(fld),0)=0.
Если использовать sum(isnull(fld,0)), то результат будет такой же.
Какая-то разница (и какой-то смысл) мог быть при count, но не при sum.
6 июн 18, 12:17    [21472235]     Ответить | Цитировать Сообщить модератору
 Re: Подставить значение 0 если нет данных во второй таблице  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
мдяб Alibek B. вы планы сравнивали (не визуально)?

 select  ISNULL(sum(x.i),10) 
  from (
    select i = 10
	union all
	select i =20
	union all
	select i= cast(NULL as int)
  ) x

 
  select  sum(isnull(x.i, 10))
  from (
    select i = 10
	union all
	select i =20
	union all
	select i= cast(NULL as int)
  ) x
6 июн 18, 12:20    [21472251]     Ответить | Цитировать Сообщить модератору
 Re: Подставить значение 0 если нет данных во второй таблице  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Alibek B.
iap
Что будет, если некоторые из слагаемых в SUM() будут равны NULL?

null при суммировании игнорируется. Если все слагаемые null, то и сумма будет null. В этом случае isnull(sum(fld),0)=0.
Если использовать sum(isnull(fld,0)), то результат будет такой же.
Какая-то разница (и какой-то смысл) мог быть при count, но не при sum.
Не просто проигнорируются.
Вернётся предупреждение, что значения NULL были проигнорированы.
И это сообщение не получится подавить.
Некоторые приложения такого рода сообщения трактуют как ошибку в запросе.
Мне не раз приходилось сталкиваться с этим. Поэтому всегда предпочитаю применять ISNULL(Field,0) внутри SUM().
6 июн 18, 12:25    [21472265]     Ответить | Цитировать Сообщить модератору
 Re: Подставить значение 0 если нет данных во второй таблице  [new]
Alibek B.
Member

Откуда:
Сообщений: 3588
Критерий истины — практика.
http://sqlfiddle.com/#!18/bf804/1/0
6 июн 18, 12:31    [21472288]     Ответить | Цитировать Сообщить модератору
 Re: Подставить значение 0 если нет данных во второй таблице  [new]
Alibek B.
Member

Откуда:
Сообщений: 3588
iap
Не просто проигнорируются.
Вернётся предупреждение, что значения NULL были проигнорированы.
И это сообщение не получится подавить.
Некоторые приложения такого рода сообщения трактуют как ошибку в запросе.

ИМХО слишком условная причина.
Я с MSSQL работал достаточно давно, но мне сложно представить, чтобы информационные сообщения клиент интерпретировал как ошибку запроса.
6 июн 18, 12:38    [21472308]     Ответить | Цитировать Сообщить модератору
 Re: Подставить значение 0 если нет данных во второй таблице  [new]
Посетитель
Member

Откуда:
Сообщений: 1209
[quot iap]
Alibek B.
пропущено...
Вернётся предупреждение, что значения NULL были проигнорированы.
И это сообщение не получится подавить.


эммм
set ansi_warnings off

отменили?

Alibek B.
Критерий истины — практика.


и в чем же истина заключается в вашем примере
6 июн 18, 12:53    [21472365]     Ответить | Цитировать Сообщить модератору
 Re: Подставить значение 0 если нет данных во второй таблице  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Alibek B.
Критерий истины — практика.
http://sqlfiddle.com/#!18/bf804/1/0

и вы своей практикой в итоге получите

WITH A(A,B) AS (SELECT CAST(NULL as int),1 UNION ALL SELECT NULL,1 )
SELECT 
	ISNULL(SUM(a+ b),0),
	SUM(ISNULL(a,0)) + SUM(ISNULL(b,0))
FROM A;
6 июн 18, 12:56    [21472376]     Ответить | Цитировать Сообщить модератору
 Re: Подставить значение 0 если нет данных во второй таблице  [new]
Alibek B.
Member

Откуда:
Сообщений: 3588
Посетитель
и в чем же истина заключается в вашем примере

sum(isnull(fld,0)) и isnull(sum(fld),0) дают одинаковый результат для любых int.
6 июн 18, 12:56    [21472381]     Ответить | Цитировать Сообщить модератору
 Re: Подставить значение 0 если нет данных во второй таблице  [new]
Alibek B.
Member

Откуда:
Сообщений: 3588
TaPaK
и вы своей практикой в итоге получите
WITH A(A,B) AS (SELECT CAST(NULL as int),1 UNION ALL SELECT NULL,1 )
SELECT 
	ISNULL(SUM(a+ b),0),
	SUM(ISNULL(a,0)) + SUM(ISNULL(b,0))
FROM A;

На какие только изощрения не идут люди, лишь бы свою проявленную глупость скрыть.
Откуда в примере взялась сложение двух полей?
Если isnull(sum(a+b),0), то почему не sum(isnull(a+b),0)?
Не нужно так сову на глобус натягивать, ей больно.
6 июн 18, 12:59    [21472395]     Ответить | Цитировать Сообщить модератору
 Re: Подставить значение 0 если нет данных во второй таблице  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Alibek B.
TaPaK
и вы своей практикой в итоге получите
WITH A(A,B) AS (SELECT CAST(NULL as int),1 UNION ALL SELECT NULL,1 )
SELECT 
	ISNULL(SUM(a+ b),0),
	SUM(ISNULL(a,0)) + SUM(ISNULL(b,0))
FROM A;

На какие только изощрения не идут люди, лишь бы свою проявленную глупость скрыть.
Откуда в примере взялась сложение двух полей?
Если isnull(sum(a+b),0), то почему не sum(isnull(a+b),0)?
Не нужно так сову на глобус натягивать, ей больно.

вы есполезны
6 июн 18, 13:00    [21472401]     Ответить | Цитировать Сообщить модератору
 Re: Подставить значение 0 если нет данных во второй таблице  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Посетитель
отменили?
SET ANSI_WARNINGS ON;
обязательно во многих случаях.
6 июн 18, 13:01    [21472402]     Ответить | Цитировать Сообщить модератору
 Re: Подставить значение 0 если нет данных во второй таблице  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Alibek B.
лишь бы свою проявленную глупость скрыть
Сам-то умником себя считаешь, а?
6 июн 18, 13:02    [21472406]     Ответить | Цитировать Сообщить модератору
 Re: Подставить значение 0 если нет данных во второй таблице  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Alibek B.
sum(isnull(fld,0)) и isnull(sum(fld),0) дают одинаковый результат для любых int.

но разный план исполнения
6 июн 18, 13:03    [21472408]     Ответить | Цитировать Сообщить модератору
 Re: Подставить значение 0 если нет данных во второй таблице  [new]
Alibek B.
Member

Откуда:
Сообщений: 3588
Maxx
но разный план исполнения

Да. И почти наверняка для последнего случая план будет лучше.
6 июн 18, 13:04    [21472414]     Ответить | Цитировать Сообщить модератору
 Re: Подставить значение 0 если нет данных во второй таблице  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Alibek B.
Maxx
но разный план исполнения

Да. И почти наверняка для последнего случая план будет лучше.

1. ето легко проверяеться
2. вы не правы
6 июн 18, 13:06    [21472424]     Ответить | Цитировать Сообщить модератору
 Re: Подставить значение 0 если нет данных во второй таблице  [new]
Alibek B.
Member

Откуда:
Сообщений: 3588
У меня MSSQL нет, чтобы проверить.
И мне сложно представить, что выгоднее N раз вычислить функцию внутри группы, чем 1 раз снаружи группы.
6 июн 18, 13:08    [21472435]     Ответить | Цитировать Сообщить модератору
 Re: Подставить значение 0 если нет данных во второй таблице  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
а ну так Вы балабол батенька, больше вопросов не имею
6 июн 18, 13:10    [21472443]     Ответить | Цитировать Сообщить модератору
 Re: Подставить значение 0 если нет данных во второй таблице  [new]
Alibek B.
Member

Откуда:
Сообщений: 3588
Maxx
но разный план исполнения

Кстати, а почему?
Разве выражения в select хоть как-то влияют на план выполнения?
Во всяком случае в Oracle и MySQL нет никакой разницы между sum(nvl) или nvl(sum).
6 июн 18, 13:20    [21472492]     Ответить | Цитировать Сообщить модератору
 Re: Подставить значение 0 если нет данных во второй таблице  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Alibek B.,
1. как сказано - план, или по вашему "игнорирует" по волшебству?

+
--SET SHOWPLAN_ALL ON     select  ISNULL(sum(x.i),0)     from (      select i = 10   union all   select i =20   union all   select i= cast(NULL as int)    ) x
  |--Compute Scalar(DEFINE:([Expr1005]=isnull([Expr1004],(0))))
       |--Compute Scalar(DEFINE:([Expr1004]=CASE WHEN [Expr1006]=(0) THEN NULL ELSE [Expr1007] END))
            |--Stream Aggregate(DEFINE:([Expr1006]=COUNT_BIG([Union1003]), [Expr1007]=SUM([Union1003])))
                 |--Constant Scan(VALUES:(((10)),((20)),(NULL)))
 select  sum(isnull(x.i, 0))    from (      select i = 10   union all   select i =20   union all   select i= cast(NULL as int)    ) x
  |--Compute Scalar(DEFINE:([Expr1004]=CASE WHEN [Expr1005]=(0) THEN NULL ELSE [Expr1006] END))
       |--Stream Aggregate(DEFINE:([Expr1005]=Count(*), [Expr1006]=SUM(isnull([Union1003],(0)))))
            |--Constant Scan(VALUES:(((10)),((20)),(NULL)))


2.
WITH A(B) AS
(
SELECT 1
)
SELECT
        SUM(ISNULL(B,0)) AS Sales,
        ISNULL(SUM(B),0) AS Sales
FROM     A    
WHERE 1=0


3. Warning который спамит во все стороны, для джобов это отдельное веселье

4. Потенциально вы всегда должны помнить что же выбрать ISNULL(SUM()) или SUM(ISNULL()) из за того что внетри суммы.

5. Вы бесполезны

Сообщение было отредактировано: 6 июн 18, 16:47
6 июн 18, 13:28    [21472529]     Ответить | Цитировать Сообщить модератору
 Re: Подставить значение 0 если нет данных во второй таблице  [new]
Alibek B.
Member

Откуда:
Сообщений: 3588
TaPaK
Вы бесполезны

Не нервничайте, корвалол попейте.
Ляпнули глупость публично, не хватило духу признать, начали юлить.
Бывает. Видны задатки журналиста.
6 июн 18, 13:33    [21472556]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить