Перекресный запрос

ЧАстые Вопросы и Ответы

Модераторы: kdv, CyberMax

Torkvemada
Сообщения: 21
Зарегистрирован: 02 авг 2006, 11:28

Перекресный запрос

Сообщение Torkvemada » 02 авг 2006, 11:44

Please, help, люди...
Можно ли создать каким-либо образом перекресный запрос, как это делается в Access.

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 02 авг 2006, 11:52

Не силен я в Акцессе... Пример "перекрестного" запроса?

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 02 авг 2006, 11:53

Благородный дон имеет в виду join ?

Torkvemada
Сообщения: 21
Зарегистрирован: 02 авг 2006, 11:28

Сообщение Torkvemada » 02 авг 2006, 11:59

Ну что такое join я вроде как понял,
а пример перкресного запроса:
арт1 - прайс1 - цена1
арт1 - прайс2 - цена2
арт1 - прайс3 - цена3
арт2 - прайс1 - цена4
арт2 - прайс3 - цена5
...

и если это всё можно было перевести в таблицу:
прайс1 прайс2 прайс3
арт1 цена1 цена2 цена3
арт2 цена4 цена5
то в Access это называется перекресный запрос.
так можно ли сконструировать такой запрос?

Torkvemada
Сообщения: 21
Зарегистрирован: 02 авг 2006, 11:28

Сообщение Torkvemada » 02 авг 2006, 12:01

Извиняюсь, так вторая табличка должна лучше смотреться
прайс1 прайс2 прайс3
арт1 цена1 цена2 цена3
арт2 цена4 цена5

Torkvemada
Сообщения: 21
Зарегистрирован: 02 авг 2006, 11:28

Сообщение Torkvemada » 02 авг 2006, 12:04

и снова гадко получилось, может так лучше?
------------прайс1-----прайс2------прайс3
арт1-------цена1------цена2-------цена3
арт2-------цена4--------------------цена5

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 02 авг 2006, 12:16

Например, вот так:

Код: Выделить всё

SELECT
    A.ID,
    A.ART_NAME
    P1.ART_PRICE,
    P2.ART_PRICE,
    P3.ART_PRICE
FROM
    ARTICUL A
    LEFT JOIN PRICE1 P ON A.ID = P1.ID_ART
    LEFT JOIN PRICE2 P ON A.ID = P2.ID_ART
    LEFT JOIN PRICE3 P ON A.ID = P3.ID_ART
ORDER BY
    A.ART_NAME
Но это при условии, что прайсы у тебя в отдельных таблицах.

Torkvemada
Сообщения: 21
Зарегистрирован: 02 авг 2006, 11:28

Сообщение Torkvemada » 02 авг 2006, 12:41

если бы это было в разных таблицах, то проблем бы не было, и здесь я с вами категорически согласен.
вопрос в том, что делать, если это одна таблица:

артикулы---тип прайса------Цена
арт1--------прайс1-----------цена1
арт1--------прайс2-----------цена2
арт1--------прайс3-----------цена3
арт2--------прайс1-----------цена4
арт2--------прайс3-----------цена5 и.т.д

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 02 авг 2006, 13:06


Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 02 авг 2006, 13:28

CyberMax писал(а):Например, вот так:

Код: Выделить всё

SELECT
    A.ID,
    A.ART_NAME
    P1.ART_PRICE,
    P2.ART_PRICE,
    P3.ART_PRICE
FROM
    ARTICUL A
    LEFT JOIN PRICE1 P ON A.ID = P1.ID_ART
    LEFT JOIN PRICE2 P ON A.ID = P2.ID_ART
    LEFT JOIN PRICE3 P ON A.ID = P3.ID_ART
ORDER BY
    A.ART_NAME
Но это при условии, что прайсы у тебя в отдельных таблицах.
Коллега, 3 таблицы и все под одним псевдонимом :)

что делать, если это одна таблица:
Дочитать доку до фразы group by, далее читать с удвоенным вниманием. Потом либо вложенные запросы либо приджойнить эту таблицу саму на себя 4 раза.

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 02 авг 2006, 13:45

Ivan_Pisarevsky писал(а): Коллега, 3 таблицы и все под одним псевдонимом :)
Ну опечатался я, с нуля ж писал :D. Главное, идея чтобы понятна была.

Torkvemada
Сообщения: 21
Зарегистрирован: 02 авг 2006, 11:28

Сообщение Torkvemada » 02 авг 2006, 14:29

Спасибо, спасибо, и ещё раз спасибо!!!
непрямену воспользоваться советом :!:

Torkvemada
Сообщения: 21
Зарегистрирован: 02 авг 2006, 11:28

Сообщение Torkvemada » 03 авг 2006, 07:01

Работает!!! Спасибо!!! :!:
А может быть тогда ещё подскажете, как переименовать имена столбцов по имени используемого прайса :?:
(as прайс1 для каждого долго писать - может быть это как то можно упростить :?: )

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 03 авг 2006, 08:05

Torkvemada писал(а):(as прайс1 для каждого долго писать - может быть это как то можно упростить :?: )
Куда уж проще-то? :roll:

Torkvemada
Сообщения: 21
Зарегистрирован: 02 авг 2006, 11:28

Сообщение Torkvemada » 07 авг 2006, 07:20

Вот, вы люди умные, так подскажите мне дураку, как сделать так, что бы в этом таком хорошем перекресном запросе прога выводила только один артикул.
пишу я вот такой запрос:

Код: Выделить всё

select ar.articul, ar.price_kind, pr1.price_rub, pr1.price_kind, pr2.price_rub,  pr2.price_kind,
pr3.price_rub,  pr3.price_kind
from disccard ar
left join disccard pr1 on ar.articul = pr1.articul
left join disccard pr2 on ar.articul = pr2.articul
left join disccard pr3 on ar.articul = pr3.articul
inner join pricekind pr on pr.id_pricekind = ar.price_kind
where 
pr1.price_kind = 0
and pr2.price_kind = 3
and pr3.price_kind = 575
and ar.price_kind in (0, 3, 575)
и он выводит каждый артикул по три раза.
конечно можно написать заместо

Код: Выделить всё

and ar.price_kind in (0, 3, 575)

Код: Выделить всё

and ar.price_kind = 0

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

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 07 авг 2006, 08:57

Прога твоя? Ну и подавляй все артикулы кроме первого в группе. Программер ты или где?

Torkvemada
Сообщения: 21
Зарегистрирован: 02 авг 2006, 11:28

Сообщение Torkvemada » 07 авг 2006, 09:06

Dimitry Sibiryakov писал(а):Программер ты или где?
угу, вот как неделю назад SQL освоил... :(
так как ты думаешь, программер я, или где...

может всё-таки лучше, please, подскажешь как это делается?

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 07 авг 2006, 10:35

Ivan_Pisarevsky писал(а):Дочитать доку до фразы group by, далее читать с удвоенным вниманием.
Ась?

Torkvemada
Сообщения: 21
Зарегистрирован: 02 авг 2006, 11:28

Сообщение Torkvemada » 09 авг 2006, 13:25

Ivan_Pisarevsky писал(а):
Ivan_Pisarevsky писал(а):Дочитать доку до фразы group by, далее читать с удвоенным вниманием.
Ась?
а подсказать, что нехватает ровно одного слова после функции select, было сложно???

а не один из указанных способов у меня работать не захотел :(

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 09 авг 2006, 13:54

Torkvemada писал(а):а подсказать, что нехватает ровно одного слова после функции select, было сложно???
Просто всем лень копаться в твоих... странных структурах данных. На нормальных структурах это "одно слово" не помогает.

Ответить