Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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     ID
111         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.009 c
15-1220416603
MdbPero
2008-09-03 08:36
2008.10.26
Экспорт схемы в Oracle


2-1221833280
Alexei
2008-09-19 18:08
2008.10.26
Запуск приложения


15-1220267957
Adventure
2008-09-01 15:19
2008.10.26
Слеить EXE и DLL


2-1221557905
Fynjy
2008-09-16 13:38
2008.10.26
как перенести выбранное обозначение в другую форму?


15-1220435620
diiimmmmaaaaa
2008-09-03 13:53
2008.10.26
ICQ клиент (выбрать)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский