Форум: "Начинающим";
Текущий архив: 2008.10.26;
Скачать: [xml.tar.bz2];
ВнизПодскажите как написать запрос !!! Найти похожие ветки
← →
AlekseyB (2008-09-18 11:01) [0]Вообщем идея такая :
Нужно из одно таблички выбрать нужные данные и положить их в другую табличку.
Есть табличка из которой будем брать данные:
Name Kol ID
111 10 1
222 5 1
111 12 2
Моя табличка такая: (т.е. то что должно получиться)
Name Osn Dop
111 10 12
222 5 1
Вообщем отбор идет по условию, т.е. по полю ID, если ID=1 то значение Kol ложим в Osn, а если ID=2, то в Dop
Name,т.е. у них одинаковое
Заранее спасибо
← →
AlekseyB (2008-09-18 11:13) [1]делаю так :
insert into Tovar1(Name,Osn,Dop)
select distinct Name,Kol,Kol from Tovar
Получаю :
Name Osn Dop
111 10 0
111 0 12
222 5 1
А как вот 111 объеденить, чтобы получилось :
Name Osn Dop
111 10 12
← →
int64 (2008-09-18 11:28) [2]Настораживает "distinct"
У тебя могут быть такие исходные?
Name Kol ID
111 10 1
111 10 1
222 5 1
111 12 2
или
Name Kol ID
111 6 1
111 10 1
222 5 1
111 12 2
← →
Правильный$Вася (2008-09-18 11:29) [3]
> 222 5 1
почему у тебя получается так? ведь для ID=2 нет ничего
← →
Труп Васи Доброго © (2008-09-18 11:32) [4]Ты сам точно понимаешь чего хочешь?
Ты хочешь получить 111 10 12 как?
Если сложить то select Name, sum(Osn), sum(Dop) FROM Tovar1 GROUP by Name
Поясни, а то мелафон сломался.
← →
AlekseyB (2008-09-18 11:40) [5]
> У тебя могут быть такие исходные?
>
> Name Kol ID
>
> 111 10 1
> 111 10 1
> 222 5 1
> 111 12 2
>
> или
>
> Name Kol ID
>
> 111 6 1
> 111 10 1
> 222 5 1
> 111 12 2
Нет так быть не может !!!
← →
sniknik © (2008-09-18 11:55) [6]AlekseyB (18.09.08 11:13) [1]
> А как вот 111 объеденить, чтобы получилось :
группировкой по подзапросу в который подставить то что у тебя выдает
если конечно сервер позволяет подзапросы...
и проблема еще в том, что, из того что ты показал
> делаю так :
> ...
> select distinct Name,Kol,Kol from Tovar
> Получаю :
ну никак не получить
> Name Osn Dop
> 111 10 0
> 111 0 12
> 222 5 1
откуда нули взялись? повторение поля даст повторение значения а вовсе не 0 (или 1 что для второго имени).
т.е. врешь ты зачем то... показать видимость деятельности, чтобы быстрее готовый код дали?
Труп Васи Доброго © (18.09.08 11:32) [4]
> Ты хочешь получить 111 10 12 как?
легко, например - группировка + два "сум" по одному и тому же полю с условием которое в зависимости от другого поля либо отдает значение либо ноль.
главное чтобы используемый сервер поддерживал синтаксис.
> Нет так быть не может !!!
а как может? того чего ты показываешь тоже не может быть.
← →
int64 (2008-09-18 12:01) [7]Тебе надо взять все имена и присоединить: сначала кол, где ид = 1, потом кол, где ид = 2. Так?
← →
Johnmen © (2008-09-18 12:01) [8]> AlekseyB (18.09.08 11:01)
А какая СУБД, как всегда, тайна великая есть?
← →
AlekseyB (2008-09-18 12:06) [9]
> Тебе надо взять все имена и присоединить: сначала кол, где
> ид = 1, потом кол, где ид = 2. Так?
Да действительно все так !!! Хорошо постараюсь еще раз объяснить. Есть товар, который хранится на складах №1 или №2, а может быть и там там. Т.е. мне нужно построить табличку, Например, товар 111 находится на складе №1 - 10 штук, на складе №2 - 2 штуки
← →
int64 (2008-09-18 12:11) [10]select distinct t0.Name, t1.Kol as Osn, t2.Kol as Dop
from Tovar t0 left join
Tovar t1 on t0.Name = t1.Name and t1.ID = 1 left join
Tovar t2 on t0.Name = t2.Name and t2.ID = 2
← →
AlekseyB (2008-09-18 12:19) [11]
> int64
Извени конечно, но объясни мне плиз, что такое t0,t1,t2. У меня MS SQL, на нем надо запросик написать, но смысл впринципе понял, но.... Спасибо !!!
← →
int64 (2008-09-18 12:35) [12]Удобочитаемость инструкции SELECT может быть улучшена с помощью псевдонима таблицы, известного также как корреляционное имя или переменная диапазона. Псевдоним таблицы можно назначить с ключевым словом AS или без него:
· table_name AS table alias
· table_name table_alias
В следующем примере псевдоним c назначается таблице Customer, а псевдоним s - таблице Store.
USE AdventureWorks;
GO
SELECT c.CustomerID, s.Name
FROM Sales.Customer AS c
JOIN Sales.Store AS s
ON c.CustomerID = s.CustomerID
Если для таблицы назначен псевдоним, то во всех явных ссылках на таблицу в инструкциях Transact-SQL необходимо использовать псевдоним, а не имя таблицы. Например, выполнение следующей инструкции SELECT приводит к синтаксической ошибке, потому что в ней используется имя таблицы, для которой назначен псевдоним:
SELECT Sales.Customer.CustomerID, /* Illegal reference to Sales.Customer. */
s.Name
FROM Sales.Customer AS c
JOIN Sales.Store AS s
ON c.CustomerID = s.CustomerID
← →
ЮЮ © (2008-09-18 12:46) [13]> но смысл впринципе понял, но.... Спасибо !!!
Ну-ну :)
а врзможны двк зваиси такого плана?
Name Kol ID111 10 1
111 15 1
← →
AlekseyB (2008-09-18 12:49) [14]
> а врзможны двк зваиси такого плана?
>
> Name Kol ID
> 111 10 1
> 111 15 1
>
я УЖЕ ГОВОРИЛ, ЧТО НЕТ !!
← →
AlekseyB (2008-09-18 13:02) [15]
> int64
Честно сказать совсем запутался, т.е. получается, что у нас работают 3 таблицы ? Илия я что то путаю ? Допустим у меня есть исходная таблица SCLAD и моя табличка Tovar, куда мне необходимо перенести данные. Этих табличек будет достаточно или надо все таки еще что то сделать ?
← →
oldman © (2008-09-18 13:13) [16]
> табличек будет достаточно или надо все таки еще что то сделать
> ?
Даже твоя Tovar не нужна, если хочешь именно запросом.
← →
clickmaker © (2008-09-18 13:17) [17]Name Kol ID
111 10 1
222 5 1
111 12 2
Моя табличка такая: (т.е. то что должно получиться)
Name Osn Dop
111 10 12
222 5 1
Вообщем отбор идет по условию, т.е. по полю ID, если ID=1 то значение Kol ложим в Osn, а если ID=2, то в Dop
insert into table2(Name, Osn, Dop)
select Name,
(case when ID = 1 then Kol else 0),
(case when ID = 2 then Kol else 0)
from table1
update table2
from table2 t2 inner join table1 on table1.Name = t2.Name
set Osn = (case when Osn = 0 then Kol else Osn),
Dop = (case when Dop = 0 then Kol else Dop)
from table2 inner join table1 on table1.Name = table2.Name
← →
clickmaker © (2008-09-18 13:32) [18]можно, кстати, смержить
111 10 0
111 0 12
222 5 1
update table2 set Dop = (select Dop from table2 t2 where t2.Name = Name and Osn = 0)
where Dop = 0
delete from table2 where Osn = 0
← →
AlekseyB (2008-09-18 13:37) [19]
> insert into table2(Name, Osn, Dop)
> select Name,
> (case when ID = 1 then Kol else 0),
> (case when ID = 2 then Kol else 0)
> from table1
Сделал вот так, но что то говорит некоректный синтаксис, хотя ничего не менял.
← →
clickmaker © (2008-09-18 13:39) [20]> [19] AlekseyB (18.09.08 13:37)
там end не хватает в case
так ты ж результаты этого уже получил. См. [18]
← →
AlekseyB (2008-09-18 14:01) [21]> clickmaker © (18.09.08 13:39) [20]
>
> > [19] AlekseyB (18.09.08 13:37)
>
Сделал вот так, но все равно неправильно выдает данные :
insert into ZAYAVKA..Tovar(_Name_Tovar,_Art_Tovar,_Kolch,_Og)
select NAME_ARTIC,COD_ARTIC,
(case when ID_SCLAD = 1 then REZ_KOLCH else 0 end),
(case when ID_SCLAD = 2 then REZ_KOLCH else 0 end)
from Omsk2008..SCL_ARTC
← →
Труп Васи Доброго © (2008-09-18 14:08) [22]
> легко, например - группировка + два "сум" по одному и тому
> же полю с условием которое в зависимости от другого поля
> либо отдает значение либо ноль.
Ты мне это рассказываешь? В моём сообщении как раз и есть такой запрос, если ты его читал внимательно.
Я спрашивал не о возможности, а о том, как именно он хочет получить результат - сложить, перемножит, найти среднее или ещё чего другого.
← →
Johnmen © (2008-09-18 14:28) [23]
SELECT
Name,
SUM((2-ID)*Kol),
SUM((ID-1)*Kol)
FROM Table
GROUP BY Name
PS
А в общем налицо кривое проектирование...
← →
ПРавильный$Вася (2008-09-18 14:31) [24]
> налицо кривое проектирование
а оно там было?
← →
Johnmen © (2008-09-18 14:36) [25]
> а оно там было?
Ну, если вдруг было :)
← →
AlekseyB (2008-09-19 08:08) [26]
> SELECT
> Name,
> SUM((2-ID)*Kol),
> SUM((ID-1)*Kol)
> FROM Table
> GROUP BY Name
А если мне необходимо еще одно поле из этой же таблички ? Можно как то это реализовать. Так то работает, но если я хочу еще одно поле, то не получается
← →
sniknik © (2008-09-19 08:43) [27]AlekseyB (18.09.08 14:01) [21]
> Сделал вот так, но все равно неправильно выдает данные :
суммы поверх условий не хватает. посмотри на другие запросы сдесь и подумай, в них то ты ее используешь.
← →
AlekseyB (2008-09-19 08:51) [28]Делаю вот так :
insert into ZAYAVKA..Tovar(_Art_Tovar,_Kolch,_Og)
SELECT distinct COD_ARTIC,
SUM(case when ID_SCLAD=2 then REZ_KOLCH else 0 end),
SUM(case when ID_SCLAD=3 then REZ_KOLCH else 0 end),
FROM Om2008..SCL_ARTC
GROUP BY COD_ARTIC
Да, все работает замечательно, но мне нужно еще дно поле выдернуть из таблицы Om2008..SCL_ARTC. И если я его пытаюсь также выдернуть как и те которые есть , то он ругается, что не может. Можно ли ка нить еще лдно поле добавить ?
← →
Johnmen © (2008-09-19 09:40) [29]
> Можно ли ка нить еще лдно поле добавить ?
Можно. А значение поля какой записи д.б. взято?
← →
031178 (2008-09-19 10:01) [30]Есть поле COD_ARTIC - это типа артикул товара, а еще в этой же табличке есть поле NAME_ARTIC - это типа наименование, т.е. наименование может быть одно, а артикулы разные. Типа :
NAME_ARTIC COD_ARTIC
Шкаф ПРЕ567
Шкаф ОРН564
Стул ЛОД65
Стул РРР98
Вот и необходимо добавить еще поле NAME_ARTIC в мою табличку
← →
Johnmen © (2008-09-19 10:12) [31]
....
SELECT COD_ARTIC,
SUM(case when ID_SCLAD=2 then REZ_KOLCH else 0 end),
SUM(case when ID_SCLAD=3 then REZ_KOLCH else 0 end),
MIN(NAME_ARTIC)
....
Обращаю внимание на отсутствие дистинкта.
Но главный совет - заняться проектированием, а не гимороем составления запросов к кривым таблицам...
← →
sniknik © (2008-09-19 11:14) [32]> а не гимороем составления запросов к кривым таблицам...
таблица может и нормальная (т.к. чужая к примеру), это понятия и желания у него кривые...
ну вот почему главное в попытке "схлопывания" название, когда тут еще всплыл артикул товара (покопать то может и список связанных баркодов найдется и все остальное...)
одно название может быть у совершенно разных вещей
ну, например представим что там есть еще поле (а скорее всего и не одно...)
COD_ARTIC NAME_ARTIC ATTRIBUTE PRICE
ПРЕ567 Шкаф Дуб, Полироль $18000
ОРН564 Шкаф Дсп, Офисный $300
ЛОД65 Стул Кожа $100
РРР98 Стул Металл, пластик $20
т.е. понятно, что вещи хотя и с одним названием совершенно разные, с разной ценой и всем остальным, т.е. полностью запись а не только артикул (!!!). а он пытается объединить по названию, а остальное судя по всему взять от разных записей... будет после из всех один шкаф из мореного дуба с ценой шкафа из дсп... "гениально!". (ну или чтото типа, в зависимости от того какие там поля присутствуют в реальности)
← →
AlekseyB (2008-09-19 11:51) [33]
> > а не гимороем составления запросов к кривым таблицам..
> .
> таблица может и нормальная (т.к. чужая к примеру), это понятия
> и желания у него кривые...
> ну вот почему главное в попытке "схлопывания" название,
> когда тут еще всплыл артикул товара (покопать то может и
> список связанных баркодов найдется и все остальное...)
> одно название может быть у совершенно разных вещей
> ну, например представим что там есть еще поле (а скорее
> всего и не одно...)
> COD_ARTIC NAME_ARTIC ATTRIBUTE PRICE
> ПРЕ567 Шкаф Дуб, Полироль
> $18000
> ОРН564 Шкаф Дсп, Офисный
> $300
> ЛОД65 Стул Кожа
> $100
> РРР98 Стул Металл, пластик
> $20
> т.е. понятно, что вещи хотя и с одним названием совершенно
> разные, с разной ценой и всем остальным, т.е. полностью
> запись а не только артикул (!!!). а он пытается объединить
> по названию, а остальное судя по всему взять от разных записей.
> .. будет после из всех один шкаф из мореного дуба с ценой
> шкафа из дсп... "гениально!". (ну или чтото типа, в зависимости
> от того какие там поля присутствуют в реальности)
Умно !!! Красиво размышлять не запретишь !!! :-)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.10.26;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.007 c