Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Написать функцию, которая бы пробегала по всем записям одной таблицы и заносила бы их id в запрос на место Х

Добрый день! Помогите написать функцию, которая бы пробегала по всем записям одной таблицы и заносила бы их id в запрос на место Х, и по записям второй таблицы и заносила бы их id на место Y:
Код SQL
1
SELECT SUM(vvalue) FROM t_units WHERE ntypeid=Y AND vinout='OUTGOING' AND nnumberid=Х
Ответ: Спасибо.

Добавлено через 19 часов 38 минут
Всеж функция нужна тоже.

Объединить эти три запроса в одной функции, которая бы обновляла запись в поле nbalance:
Код SQL
1
2
3
4
5
SELECT n.vnumber, t.vname, t.noutfavoritecost, noutsystemcost, noutothercost, noutcityphonecost, noutinternationalcost, nsmscost, nmmscost, nwapcost FROM t_numbers n   
FULL JOIN t_contract c 
FULL JOIN t_tariff t ON c.ntariffid=t.id
ON c.id=n.ncontractid
GROUP BY n.vnumber, t.noutfavoritecost, t.vname, noutsystemcost, noutothercost, noutcityphonecost, noutinternationalcost, nsmscost, nmmscost, nwapcost
Код SQL
1
2
3
4
5
6
SELECT n.vnumber, t.vname, SUM(c.vvalue) FROM t_numbers n   
FULL JOIN t_units c 
FULL JOIN t_unittype t ON c.ntypeid=t.id
ON c.nnumberid=n.id
WHERE vinout='OUTGOING'
GROUP BY n.vnumber, t.vname
Код SQL
1
2
3
4
5
SELECT n.vnumber, t.vname, SUM(c.nvalue) FROM t_numbers n    
FULL JOIN t_cashactions c 
FULL JOIN t_cashactiontype t ON c.ncashactiontypeid=t.id
ON c.nnumberid=n.id
GROUP BY n.vnumber, t.vname
обновлять данные так:
Код SQL
1
UPDATE t_numbers SET nbalance =  (Х*Y+Z) WHERE id=res.nnumberid;
, где Х - результат первого запроса, Y - результат sum(c.nvalue) второго запроса, Z - результат sum(c.nvalue) третьего запроса, rec - RECORD

Добавлено через 5 минут
т.е nbalance = (noutfavoritecost*Y + noutsystemcost*Y + noutothercost*Y + ... + nwapcost*Y) + Z
Вопрос: Написать функцию, которая возвращает список библиотекарей и количество выданных каждым из них книг

Собственно проблема вот в задании, которое видно из названия темы:
Написать функцию, которая возвращает список библиотекарей и количество выданных каждым из них книг.
Что сделано:
T-SQL
1
2
3
4
5
6
7
8
9
10
GO
CREATE FUNCTION LibsList()
RETURNS TABLE 
AS RETURN (SELECT l.FirstName+' '+l.LastName AS 'Библиотекарь', COUNT(b.Id) AS 'Кол-во'
FROM Libs l
JOIN S_Cards sc ON sc.Id_Lib=l.Id
JOIN T_Cards tc ON tc.Id_Lib=l.Id
JOIN Books b ON tc.Id_Book=b.Id AND sc.Id_Book=b.Id
GROUP BY l.FirstName,l.LastName)
GO
Результат получается совершенно не корректным...
При этом если сделать подсчет только для студентов(таблица S_Cards)
T-SQL
1
2
3
4
5
6
7
8
9
GO
CREATE FUNCTION LibsList()
RETURNS TABLE 
AS RETURN (SELECT l.FirstName+' '+l.LastName AS 'Библиотекарь', COUNT(b.Id) AS 'Кол-во'
FROM Libs l
JOIN S_Cards sc ON sc.Id_Lib=l.Id
JOIN Books b ON sc.Id_Book=b.Id 
GROUP BY l.FirstName,l.LastName)
GO
то получается все хорошо. Или если только для T_Cards. В общем почему так происходит я понять не могу. Надеюсь на вашу помощь.
Ответ: Вроде понятно. Спасибо огромное!
Вопрос: Написать процедуру, которая добавляет нового заказчика

только начали изучать процедуры. Хочу сделать процедуру, которая добавляет нового заказчика
Что не так?
Код SQL
1
2
3
4
5
6
CREATE PROCEDURE новый_заказчик
(@k INT(50), @n CHAR(50), @e INT(50))
BEGIN
INSERT INTO Заказчик (Код_заказчика, ФИО_заказчика, телефон_заказчика) 
VALUE (@k,@n,@e)
END
Ответ: Найдите 4 отличия
Код T-SQL
1
2
3
4
5
6
CREATE PROCEDURE новый_заказчик
(@k INT, @n CHAR(50), @e INT)
AS BEGIN
INSERT INTO Заказчик (Код_заказчика, ФИО_заказчика, телефон_заказчика) 
VALUES (@k,@n,@e)
END
Вопрос: Помогите написать функцию Atrim()

Помогите написать функцию которая обрезает пустой текст и слева и справа, т.е чтоб не писать постоянно: RTRIM(LTRIM(@sStr)).
а написать Atrim(@sStr)
Ответ:
aleks222
klikli
огромменые таблицы в dbf которые я не точто предворительно триминговать не могу я их нормально загрузить на SQL не могу из-за огроменного размера (в каждой по 10 мил.записей и около 100 полей) если б был способ прочитать dbf построчно в t-SQL я триминговал все поля. Щас я ищу способ грузить dbf построчно и переберать все поля в цикле, ибо неизвестно какие поля будут в следующем месяце (да именно не известно, потому что компания что шлёт их сегодня пришлет так а завтро наоборт с добавлением или отсечением полей, а ты как хочешь так и крутись).


Вас из дворников перевели в программисты?
DBF грузятся в MS SQL легко и непринужденно.

Также легко и непринужденно можно их транкейтить, и не "по-строчно", а гопом.


димагогия = Дима и Гогия
Вопрос: Написать функцию, которая вычисляет сумму заказа

Здраствуйте я новичов в sql. Помогите написать функцыю которая вычесляет сумму заказа (сумма материалов(Material.price+ зарплата ювелира(J.Mark_up+J.Production_time*Jl.Hourly_rate)
Спасибо!
Ответ: ну я не могу с картинки точно воспроизвести слово. Может у тебя там русские буквы где есть.
Приведи скрипт создания таблицы что-ли
Вопрос: Изменение цены товара

Есть таблица товаров tProd: prID, prName, prName.
Есть таблицы групп операции tGrOper: grID, grDate, grType.
Есть таблица операции tOper: opID, grID, opPrice, opQty.
Товар приходит в магазин по одной цене, но бывает что в течении месяца цена товара может измениться 1 или даже более раза (в таблице tProd), и соответственно будет продаваться по измененной цене (в таблице tOper).
В конце месяца на ревизию надо выставить должный остаток товаров в суммовой схеме.
Т.е. раньше когда цена не изменялась я делал так: Сумма прошлого остатка + Сумма приходов - Сумма продаж = Сумма должного остатка.
А сейчас как можно нарисовать схему с участием переоценки?
Ответ: Делайте количественный учёт, и выставляйте его на ревизию по актуальной цене. Какие проблемы?
Вопрос: Не могу создать запрос в Access 2010, в который выводится кол_во оставшихся товаров на складе

Помогите пожалуйста создать запрос в Access 2010, в который выводится кол_во оставшихся товаров на складе, после поставки, продаж и заказов количество товара должно изменяться. Получилось сделать только остаток именно тех товаров, которые есть в таблицах Продажа и Заказы, да они ещё и не группируются, а вот как вывести полностью все товары - сообразить не могу. Заранее спасибо.
Ответ: Заказ я решил сделать так же как и продажи, чтобы товар вычитался со склада, а как сделать чтобы кол-во не проданных товаров выводилось в остаток?

Добавлено через 3 минуты
Всё отлично, спасибо за помощь!
Вопрос: Проблема с функцией, высчитывающей дистанцию по координатам

Добрый день. Есть таблица:
  Column   |          Type           |                            Modifiers                             
-----------+-------------------------+------------------------------------------------------------------
 id        | integer                 | not null default nextval('support_taskaddress_id_seq'::regclass)
 task_id   | integer                 | not null
 longitude | double precision        | 
 latitude  | double precision        |

Написал функцию, которая бы высчитывала дистанцию по координатам пользователя и задания:
CREATE FUNCTION distane (lat1 REAL, long1 REAL, lat2 REAL, long2 REAL) RETURNS REAL AS '
DECLARE 
	x REAL = 69.1 * (lat1 - lat2);
	y REAL = 69.1 * (long1 - long2) * cos (lat1 / 57.3);
BEGIN
	RETURN sqrt(x*x + y*y);
END;
' LANGUAGE plpgsql;

Делаю запрос:
# SELECT distance(latitude, longitude, 68.0, 57.0) FROM support_taskaddress;
ERROR:  function distance(double precision, double precision, numeric, numeric) does not exist
LINE 1: SELECT distance(latitude, longitude, 68.0, 57.0) FROM suppor...
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.

Ладно, используем функцию CAST:
# SELECT distance(CAST (latitude AS REAL), CAST (longitude AS REAL), CAST (68 AS REAL), CAST (57 AS REAL)) FROM support_taskaddress;
ERROR:  column "lon2" does not exist
LINE 1: SELECT 69.1 * (lon2 - lon1) * cos(lat1 / 57.3)
                       ^
QUERY:  SELECT 69.1 * (lon2 - lon1) * cos(lat1 / 57.3)
CONTEXT:  PL/pgSQL function "distance" line 5 during statement block local variable initialization

Можете подсказать, в чем проблема?
Ответ: michaelpak,

предлагаю функцию для вычисления расстояния между двумя координатами на земном шаре
код для Oracle, но он очень легко переносится на любой язык программирования

сорри за немецкие имена, перевод в комментариях

   
   -- перевод в доли градуса по формуле: 
   -- Длина или Широта = Градусы + Минуты/60 + Секунды/3600, где Градусы,Минуты,Секунды: целочисленные

   -- код тестировался на PL/SQL для Oracle 9i

   FUNCTION DistanceInMeter(LaengeA in float, -- долгота A  в градусах
                            BreiteA in float, -- широта A  в градусах
                            LaengeB in float, -- долгота B  в градусах
                            BreiteB in float) -- широта B  в градусах
   RETURN INTEGER 
      Result   integer;

      fPhimean float;
      fdLambda float;
      fdPhi    float;
      fAlpha   float;
      fRho     float;
      fNu      float;
      fR       float;
      fz       float;
      fTemp    float;

      D2R      float := 0.017453;
      a        float := 6378137.0;
      e2       float := 0.006739496742337;

   BEGIN
      if not((LaengeA is NULL) or (BreiteA is NULL) or (LaengeB is NULL) or (BreiteB is NULL)) then
         fdLambda := (LaengeA - LaengeB) * D2R;
         fdPhi := (BreiteA - BreiteB) * D2R;
         fPhimean := ((BreiteA + BreiteB) / 2.0) * D2R;

         fTemp := 1 - e2 * (Power(Sin(fPhimean), 2));
         fRho := (a * (1 - e2)) / Power(fTemp, 1.5);
         fNu := a / (Sqrt(1 - e2 * (Sin(fPhimean) * Sin(fPhimean))));

         fz :=
            Sqrt(Power(Sin(fdPhi / 2.0), 2) + Cos(BreiteB * D2R) * Cos(BreiteA * D2R) *
               Power(Sin(fdLambda / 2.0), 2));

         fz := 2 * ASin(fz);

         if fz=0 then
            Result:=0;
         else
            fAlpha := Cos(BreiteB * D2R) * Sin(fdLambda) * 1 / Sin(fz);
            fAlpha := ASin(fAlpha);

            fR := (fRho * fNu) / ((fRho * Power(Sin(fAlpha), 2)) + (fNu *
               Power(Cos(fAlpha), 2)));

            Result := (fz * fR);
         end if;
      else
         Result:=NULL;
      end if;

      return(Result);
   END DistanceInMeter;
Вопрос: функция CLR возвращает табличное значение

Приветствую ВСЕХ!

написал функцию которая возвращает табличное значение, одно из полей возвращает значение Null
при запуске получаю данное сообщение

System.Data.SqlTypes.SqlNullValueException: Неопределенные данные. Этот метод или свойство не может вызываться для неопределенных значений


как правильно описать возвращаемое значение?

TableDefinition="field1 int ,field2 int is null"
Ответ: Спасибо, я разобрался проблема была в функции возврата значения

if (field2.IsNull)
            {
                _field2 = SqlDateTime.Null;
            }
            else
            {
                _field2 = new SqlDateTime(field2.Value);
            }


а я использовал следующий синтаксис:
 _field2 = new SqlDateTime(field2.Value);
Вопрос: Автоматическое формирование цены на основе редактируемых коэффициентов

Доброе время суток уважаемые.

пробую написать небольшой каталог товаров. И вот возник вопрос который ни как не могу решить самостоятельно и прошу помощи. вот в чем "затырка" не могу сообразить как автоматически рассчитывать цену.
имеем:
таб. А - 1.товар. 2.цена товара базовая. 3.наличие(логический да/нет)
таб. Б - 1.розничная цена 2.оптовая цена 3. цена под заказ
таб. В. - 1.розничный процент. 2. оптовый процент. 3. процент на заказ
форма А. - 1.товар 2.цена базовая. 3.цена оптовая. 3.цена розничная 4."наличие"
форма Б. - редактирование коэффициентов.

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

спасибо заранее. и могу скинуть набросок базы если у кого то будет желание поковырять ее.
Ответ: Igor2001, в таб. Б надо подставить поле с наименованием товара из раб. А. и перенести все поля раб. В. Поля с новыми ценами можно убрать, т.к. вы их увидите в запросе, в котором происходят все вычисления. происходит примерно так: на новом пустом поле пишете ЦЕНА: ПОЛЕ1 умножить на ПОЛЕ2.

Добавлено через 9 минут
Igor2001, конечно-же раб. А раб. Б - это таб. А и таб. Б. Ваш пример посмотреть не могу.

Добавлено через 12 минут
Igor2001, В формуле названия полей поставьте свои. они должны быть числовыми.