Вывод значений через запятую в запросе

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Вывод значений через запятую в запросе

Сообщение sergey-911 » 30.07.2005 (Сб) 23:16

Всем доброго времени суток.
Код: Выделить всё
SELECT Table1.Pole1, Table2.Pole2
FROM Table1 INNER JOIN Table2 ON Table1.ID = Table2.ID

Уважаемые. Здесь, для каждого значения Pole1 существует несколько значений Pole2 (один - ко многим).
Нужно, чтобы в результате запроса выводилось, к примеру, не 10 одинаковых значений Pole1 в одной колонке таблицы и соответствующие 10 разных значений Pole2 в другой. Нужно вывести одно значение Pole1 и через запятую, соответствующие значения Pole2.
Как такой запрос реализовать. :D
С уважением, Сергей.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 30.07.2005 (Сб) 23:28

Для лучшего восприятия прикрепляю Access-овский файл, см. запрос "vw_Abonent"
У вас нет доступа для просмотра вложений в этом сообщении.
С уважением, Сергей.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 01.08.2005 (Пн) 8:02

Боюсь, что никак. Правда в Access есть перекрестные запросы, они выполняют как раз то, что тебе нужно. Но это именно в Access, в других СУБД их не будет.
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 01.08.2005 (Пн) 8:57

alibek писал(а):Боюсь, что никак. Правда в Access есть перекрестные запросы, они выполняют как раз то, что тебе нужно. Но это именно в Access, в других СУБД их не будет.


На SQL-сервере нечто подобное можно реализовать в хранимой процедуре. Или формировать данный Recordset на клиенте из обычного запроса... Или ударяться в изучение OLAP...

В общем простор для выбора.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 01.08.2005 (Пн) 17:39

Всем доброго времени.
Спасибо за отзыв всем :D
Посмотрел перекрестные запросы - не совсем то, что хотелось. Возможно не совсем разобрался.
Другого пути, понимаю, нет?
Код: Выделить всё
TRANSFORM Var(vw_Abonent.AbonentID) AS [Var-AbonentID]
SELECT vw_Abonent.Абонент
FROM vw_Abonent
GROUP BY vw_Abonent.Абонент
PIVOT vw_Abonent.Телефон;

Возможно, сам запрос не правильный? :(
С уважением, Сергей.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 01.08.2005 (Пн) 20:43

вот так:
У вас нет доступа для просмотра вложений в этом сообщении.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 02.08.2005 (Вт) 23:54

Всем доброго времени. Спасибо всем.
Должно быть так:
:D
Код: Выделить всё
SELECT Abonent.AbonentID, Abonent.Abonent, GetPhones(AbonentID) AS Phones
FROM Abonent

Konst_One, спасибо. Очень помог.
Посмотрел твой сайт http://www.visualsoftru.com, грамотно.
Скачал VisualOpenDB (trial). Все продуманно, а скролл не работает? :(
Открой военную тайну. За счет чего сетка так быстро срабатывает. На то, чтобы открыть 40 тыс записей, используя VideoSoftGrid - у меня уходит время (подключение через ADO соединение, прописанное вручную). А здесь - моментально. :D
И еще, для вывода на печать, использовал ли ты свой компонент, или же сторонних разработчиков (чем-то напоминает генератор отчетов Formula1).
С уважением, Сергей.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 03.08.2005 (Ср) 0:25

Код: Выделить всё
Option Compare Database
Public cn As ADODB.Connection

Public Function GetPhones(ByVal AbonentID As String) As String
Dim s As String
Dim rs As ADODB.Recordset
   
    If cn Is Nothing Then
        Set cn = New ADODB.Connection
        cn.CursorLocation = adUseClient
        cn.Provider = "Microsoft Jet 4.0 OLE DB Provider"
        cn.Open "Data Source=" & Application.CurrentDb.Name & ";User ID=Admin;Password="
    End If
   
    Set rs = New ADODB.Recordset
    rs.CursorLocation = adUseClient
    rs.Open "select [Телефон] as Phone from vw_Abonent where AbonentID=" & AbonentID, cn, adOpenStatic, adLockReadOnly, adCmdText
   
    s = ""
    Do While Not rs.EOF
        If Len(s) = 0 Then
            s = rs.Fields(0).Value
        Else
            s = s & ", " & rs.Fields(0).Value
        End If
        rs.MoveNext
    Loop
    Set rs = Nothing

    GetPhones = s

End Function
С уважением, Сергей.

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 03.08.2005 (Ср) 10:00

использовал все стандартное, никаких сторонних контролов
отчеты делаются в HTML/XML и показываются в браузере

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 03.08.2005 (Ср) 17:39

Спасибо.
С уважением, Сергей.


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 1

    TopList  
cron