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

Откуда: Москва
Сообщений: 826
Есть ли в SQL Server 2000 функция минимума, но чтобы она возвращала не минимум в столбце, а минимум из значений нескольких полей одной строки?
23 июн 04, 18:29    [761386]     Ответить | Цитировать Сообщить модератору
 Re: MIN  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37116
Нету.
А для чего такое понадобилось?
23 июн 04, 18:32    [761393]     Ответить | Цитировать Сообщить модератору
 Re: MIN  [new]
ChA
Member

Откуда: Москва
Сообщений: 11201
Если бы такое было, было бы замечательно, но такого нет. Как вариант, можно
конкатенировать поля в одно бинарное выражение и брать минимум от него,
с дальнейшим обратным преобразованием.
23 июн 04, 18:35    [761398]     Ответить | Цитировать Сообщить модератору
 Re: MIN  [new]
avec
Member

Откуда: Москва
Сообщений: 826
а в фоксе это было очень удобно :-(
23 июн 04, 18:37    [761401]     Ответить | Цитировать Сообщить модератору
 Re: MIN  [new]
josia
Member

Откуда: http://exactpro.com
Сообщений: 482
DECLARE @a int, @b int
SET @a=5
SET @b=3
SELECT CASE WHEN @a<@b THEN @a ELSE @b END
23 июн 04, 18:41    [761416]     Ответить | Цитировать Сообщить модератору
 Re: MIN  [new]
alexia
Member

Откуда: Санкт-Петербург
Сообщений: 460
2josia
гы, а если колонок, скажем, с десяток?
23 июн 04, 18:43    [761420]     Ответить | Цитировать Сообщить модератору
 Re: MIN  [new]
josia
Member

Откуда: http://exactpro.com
Сообщений: 482
если десяток то проблем нет, проблема есть если 11
23 июн 04, 18:48    [761429]     Ответить | Цитировать Сообщить модератору
 Re: MIN  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Пишется UDF , а потом вызывается как

MyMin( MyMin(a, b), c)
23 июн 04, 18:56    [761442]     Ответить | Цитировать Сообщить модератору
 Re: MIN  [new]
avec
Member

Откуда: Москва
Сообщений: 826
CREATE FUNCTION MINVAL(@Val1 int, @Val2 int)
RETURNS int AS
BEGIN 
DECLARE @Val int
IF @Val1 < @Val2 
   SET @Val = @Val1
ELSE 
   SET @Val = @Val2
RETURN (@Val)
END
23 июн 04, 19:02    [761455]     Ответить | Цитировать Сообщить модератору
 Re: MIN  [new]
ChA
Member

Откуда: Москва
Сообщений: 11201
Ахха, опять неправильно понял вопрос... Sorry
23 июн 04, 19:06    [761465]     Ответить | Цитировать Сообщить модератору
 Re: MIN  [new]
josia
Member

Откуда: http://exactpro.com
Сообщений: 482
безобразие :(
почему UDF вложить в саму себя 11 раз можно, а такую нужную и красивую вещь как 11 вложенных CASE сделать нельзя.
23 июн 04, 19:12    [761476]     Ответить | Цитировать Сообщить модератору
 Re: MIN  [new]
Crimean
Member

Откуда:
Сообщений: 13148
11 вложенных CASE... Я попробовал представить... Не, не получается, пошел за пивом!
23 июн 04, 21:17    [761628]     Ответить | Цитировать Сообщить модератору
 Re: MIN  [new]
MustDie
Member

Откуда: Подмосковье
Сообщений: 229
Что-то тут с нормализацией, мне кажется, не так....
Но раз уж такое понадобилось, я бы через временную табличку сделал бы, ибо ленив я очень CASE-ы всякие делать да переменные описывать. Ну а чтобы для каждого поля, из которых надо MIN искать, не перебирать всю таблу отдельным селектом, взял бы курсор по нужным полям соотв. записи.
Но все это разумно, если MIN нужон по многим полям, а если их два-три то можно и ручками сравнить...

Проверено, MIN нет!
24 июн 04, 01:16    [761737]     Ответить | Цитировать Сообщить модератору
 Re: MIN  [new]
ChA
Member

Откуда: Москва
Сообщений: 11201
Если уж писать функцию MyMin, так не с двумя параметрами, а внутри хоть
засравнивайся. Пардон мой фрацузский...
24 июн 04, 01:31    [761743]     Ответить | Цитировать Сообщить модератору
 Re: MIN  [new]
ChA
Member

Откуда: Москва
Сообщений: 11201
Кстати, навеяло
CREATE FUNCTION MINVAL(@Val1 int, @Val2 int, ..., @ValN int)
RETURNS int AS
BEGIN 
RETURN (
  SELECT MIN([Val]
  FROM (
    SELECT @Val1 AS [Val]
    UNION SELECT @Val2
    ...
    UNION SELECT @ValN
  ) t
)
END
24 июн 04, 01:58    [761753]     Ответить | Цитировать Сообщить модератору
 Re: MIN  [new]
Breakneck
Member

Откуда: Kiev
Сообщений: 2454
ИМХО, самый лучший способ - транспонировать строку в столбец и применить туда MIN.
24 июн 04, 10:49    [762263]     Ответить | Цитировать Сообщить модератору
 Re: MIN  [new]
Сергей Васкецов
Member

Откуда:
Сообщений: 20362
[quot MustDie]Что-то тут с нормализацией, мне кажется, не так[quot]
Отчего же?
Представьте себе состав книги покупок/продаж. Если она электронная, документы в ней отражаются по критерию попадания в диапазон дат. Для коммерческого документа с его оплатой, "мечтающего" попасть в книгу, может быть определено как минимум 4 даты (дата документа, оплаты, прихода, получения), вот и приходится расчитывать дату отражения как максимум из 4-х полей каждой строки.
24 июн 04, 11:25    [762396]     Ответить | Цитировать Сообщить модератору
 Re: MIN  [new]
Luchkin Dmitry
Member

Откуда: Новосибирск -> Ангарск -> Братск -> Мск
Сообщений: 1921
2 Сергей Васкецов: А вот в этом примере -- однозначно с нормализацией, да и вообще с логикой проблемы большие. но уж с этим государством нам жить....
24 июн 04, 11:34    [762443]     Ответить | Цитировать Сообщить модератору
 Re: MIN  [new]
Николай МВ
Member

Откуда: Ukraine-Kyiv
Сообщений: 328
(дата документа, оплаты, прихода, получения)

И для каждой даты отдельный столбец?
Это вообще разные документы: документ оплаты, документ прихода...
Что такое "документ получения" и в чем его отличие от "документа прихода"?
А еще бывают документы вступительного баланса, остатков, пересортицы, перемещения, передачи на комиссию, возврата...

Вы правда столько столбцов будете заводить? :)
24 июн 04, 11:42    [762472]     Ответить | Цитировать Сообщить модератору
 Re: MIN  [new]
alexia
Member

Откуда: Санкт-Петербург
Сообщений: 460
В данном случае однозначно все даты нужно убирать в др. таблицу. И признак еще в нее добавить, типа, что это за дата такая.
А потом уже функцию min на полную катушку юзать.
24 июн 04, 12:00    [762578]     Ответить | Цитировать Сообщить модератору
 Re: MIN  [new]
Сергей Васкецов
Member

Откуда:
Сообщений: 20362
Николай МВ
И для каждой даты отдельный столбец?
Это вообще разные документы: документ оплаты, документ прихода...
Что такое "документ получения" и в чем его отличие от "документа прихода"?
А еще бывают документы вступительного баланса, остатков, пересортицы, перемещения, передачи на комиссию, возврата...

Вы правда столько столбцов будете заводить? :)

1) Мягко говоря, не все перечисленные Вами документы попадают в книги покупок продаж, кои сами по себе разные бывают.
2) С нормализацией никаких проблем как раз нет, если документ оплачен частями и отражает событие ОС (например, начало амортизации), он отражается столько раз, сколько есть оплат, однако, по последнему событию ОС (таково наше законодательство), и спорить с этим бесполезно.
3) Все 4 и более дат в примере состава книг покупок - это свойство даже не документа и даже не его оплаты, а свойство оплаты, которая соотносится на строку документа.
4) Рассмотрим книгу покупок по налоговым документам. Согласно нашему @#$-му законодательству, строится она по оплатам. Документ прихода - это акт перехода права собственности, например, относительно ничего не имеющий общего с налоговым документом, который отражается в книге. Дата получения же устанавливается непосредственно на налоговый документ, когда ОН ПОЛУЧЕН. Кстати, "документ поулчения" и "документ прихода" я не писал, шла речь о ДАТАХ.

alexia
В данном случае однозначно все даты нужно убирать в др. таблицу. И признак еще в нее добавить, типа, что это за дата такая.

Представьте себе миллиона полтора документов с составом порядка десяти позиций (есть как 1-2, так и сотни, это данные по весьма средненькому холдингу), если каждая номенклатура отражается по событиям ОС и документ полностью оплачивается, верхний оценочный предел количества записей (оплат строк состава), которые попадут в книгу, получается порядка 100 миллионов (обычно меньше в разы, но все же достаточно). Вы предлагаете, как я понимаю, рядом сделать табличку, в которой будет до 400 миллионов записей, которая будет ссылаться по составному ключу как минимум из 3-х numeric-ов (INT на таких объемах успешно переполняется и отдыхает, 3 - потому что как я уже писал, пары ID строки документа и ID оплаты документа недостаточно), там будет 4 даты и еще признак, что это за дата. Попробуйте оценить размер этой таблички на досуге и сами себе честно ответьте, достойная ли это замена CASE-у с выбором максимума по 4-м датам. Особенно с учетом того, что для некоторых типов документов дата отражения в точности равна дате документа (остальные либо заведомо не больше, либо вообще не определяются, например, авансовый счет-фактура), так что выбор максимума просто излишен.
24 июн 04, 13:09    [762895]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить