Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.10.26;
Скачать: CL | DM;

Вниз

Подскажите как написать запрос !!!   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.015 c
15-1220206202
silver
2008-08-31 22:10
2008.10.26
продается программист


6-1194549259
MikeLe
2007-11-08 22:14
2008.10.26
THttpCli - из ICS (TWSocket)


2-1221810379
MaxX
2008-09-19 11:46
2008.10.26
Как узнать есть ли у компонента свойство Caption ?


15-1220504333
quake
2008-09-04 08:58
2008.10.26
Создание карт


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