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

Вниз

Объеденить несколько строк из таблицы в отдну строку.   Найти похожие ветки 

 
Draught   (2007-10-01 17:11) [0]

День добрый.

Есть 2 таблицы table1 и table2

table1
ID - autoincrement
Unit - Text
...
Notes - Text

table2
ID - autoincrement
Table1ID - Integer
Name - Text
Count - Integer

свяpm вроде очевидна
table1.ID 1--M table2.Table1ID

Теперь задача:
Нужно наваять запрос, в котором для каждой записи из table1 будет соответствовать единственная запись (строка), содержащая в себе все поля из первой таблицы и соответствующие записи второй таблицы.

Пример:
table1
ID | Unit | ... | Notes
1  | First |     | бла-бла
2  | Sec |     | бла-бла-бла

table2
ID | Table1.ID | Name | Counter
1  | 1            | FF     | 5
2  | 1            | HH     | 6
3  | 2            | FF     | 4
4  | 1            | AN     | 8
5  | 1            | CK     | 3

результат:
ID | Unit | ... | Notes      | N1 | C1 | N2 | C2 | N3 | C3 | N4 | C4 |
1  | First |     | бла-бла  | FF | 5   | HH | 6   | AN | 8   | CK | 3  |
...

Выбрать все строки подряд по очереди не сложно, просто меняем номер строки и количество строк, переменные так же не сложно подобрать, но вот как сделать это все в одном запросе? например хотя бы на 4 строки, как в примере выше?

Ну и выбор нужной строки примерно так выглядит
SELECT name as Name:From, Count as Count:From FROM table2
LIMIT :From,1


 
Johnmen ©   (2007-10-01 17:42) [1]

Копай в сторону кросс-таблиц и кросс-отчетов (cross).


 
Вася Правильный   (2007-10-01 17:44) [2]

запрос с неизвестным заранее числом колонок невозможен


 
Jeer ©   (2007-10-01 17:47) [3]

SELECT
(case when YEARS_ID = 2004 then YEARS_VAL else "0" end) as Y2004,
(case when YEARS_ID = 2005 then YEARS_VAL else "0" end) as Y2005,
(case when YEARS_ID = 2006 then YEARS_VAL else "0" end) as Y2006,
(case when YEARS_ID = 2007 then YEARS_VAL else "0" end) as Y2007
FROM YEARS;


 
Вася Правильный   (2007-10-01 17:50) [4]

Jeer ©   (01.10.07 17:47) [3]
отстается придумать опцию И.Т.Д., чтоб движок сам догадался, сколько колонок взять и по каким правилам


 
Draught   (2007-10-01 18:09) [5]

2Jeer ©  
Очень интересное решение, что-нибудь теперь точно придумаем.

2Вася Правильный
Движку будет передаваться SQL запрос, составленый исходя из количества строк :)

Думаю, что дальше я уже соображу как это организовать. Спасиб за помощь :)


 
sniknik ©   (2007-10-01 18:15) [6]

> отстается придумать опцию И.Т.Д., чтоб движок сам догадался, сколько колонок взять и по каким правилам
хелп аксесса
Инструкция TRANSFORM
Создает перекрестный запрос.

Синтаксис
TRANSFORM статФункция
   инструкцияSelect
   PIVOT поле [IN (значение_1[, значение_2[, ...]])]

Ниже перечислены аргументы инструкции TRANSFORM:
...


 
Вася Правильный   (2007-10-01 18:25) [7]


> sniknik ©   (01.10.07 18:15) [6]

мдя, не знал


 
b z   (2007-10-01 18:33) [8]


> хелп аксесса

смущает только autoincrement, Integer да и последний абзац топика, не ошибся ли автор при указании субд ...


 
Draught   (2007-10-01 18:43) [9]

2b z

Нет, не ошибся, поросто писал быстро, ну и ошибся, естественно Autonumber, Number.

А что касается последнего абзаца - я же все-таки в Delphi пишу, а не в самой MSAccess, а это просто SQL запрос в ADOQuery с использованием параметров.


 
sniknik ©   (2007-10-01 22:22) [10]

> я же все-таки в Delphi пишу, а не в самой MSAccess
но ты же пользуешься его движком, а тут уж "плевать в чем писать, а синтаксис запросов соблюдать обязан"

> а это просто SQL запрос в ADOQuery с использованием параметров.
тем более, с учетом сказанного для аксесса запрос - бред, и вдвойне бред изза того как используются параметры, раз это не мудренный синтаксис неизвестной субд.


 
Draught   (2007-10-02 10:44) [11]

2sniknik ©
Синтаксис запросов соблюдается, правильнее (удобнее) использолвать переменные (:FROM) при построении запроса, нежели (+INTTOSTR(FROM)) на то параметры и существуют, к тому же эти параметры конвертируются до этапа передачи запроса СУБД, так что для СУБД разницы тоже нет никакой. Или я может чего-то не понимаю? Тогда попрошу уточнить чего именно.

На счет бреда попрошу уточнить, ибо я считаю это просто банальным невежеством и неуважением к себе.

Я ошибся при указании типов данных, используемых в таблице, по большому счету разницы нет никакой INTEGER=NUMBER а AutoIncrement=AutoNumber.


 
sniknik ©   (2007-10-02 11:22) [12]

> правильнее (удобнее) использолвать переменные
с этим никто не спорит, но всетаки правильнее использовать параметры правильно, а не так, что ни движок тебя не поймет, ни ИИ, ни даже твои коллеги по ремеслу. (с чего и было предположение сначала, что движок какойто экзотический... но раз это не так то...)

> Тогда попрошу уточнить чего именно.
SELECT name as Name:From, Count as Count:From FROM table2
LIMIT :From,1
то что этот запрос не выполнится изза "непонимаемости" движком это не доказательство бредовости?
хочеш уточнений? тогда попробуй его выполнить и читай ошибки которые тебе будет выдавать вместо отработки.



Страницы: 1 вся ветка

Текущий архив: 2008.02.17;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.02 c
15-1199946021
Некто
2008-01-10 09:20
2008.02.17
Узнаёте?


15-1200660668
Bless
2008-01-18 15:51
2008.02.17
Почему "тренЕр", но "тренИровка"


15-1200306381
alles
2008-01-14 13:26
2008.02.17
Не подскажите программу...


2-1201454536
AntonUSAnoV
2008-01-27 20:22
2008.02.17
как быть с разрешением монитора ?


2-1201046616
fluxion
2008-01-23 03:03
2008.02.17
Срок действия программы