Нужна помощь с запросом

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Нужна помощь с запросом

Сообщение Antonariy » 08.08.2006 (Вт) 15:07

Есть вьюшка, возвращающая записи как показано на картинке. value - оценка, полученная на экзамене.
Как сделать запрос, чтобы получилась такая выборка:
Код: Выделить всё
fio | анг.яз | Матем. | рус.яз | сумма баллов
---------------------------------------------------
Агеев   | 5 | 4 | 4 | 13
Белышев | 5 | 5 | 4 | 14
У вас нет доступа для просмотра вложений в этом сообщении.
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение alibek » 08.08.2006 (Вт) 15:53

А СУБД какая?
Для MSSQL можно попробовать так.
Код: Выделить всё
SELECT
fio,
SUM(CASE Name_RU WHEN 'Английский язык' THEN value ELSE 0 END) AS Англ,
SUM(CASE Name_RU WHEN 'Русский язык и литература' THEN value ELSE 0 END) AS Русск,
SUM(CASE Name_RU WHEN 'Математика' THEN value ELSE 0 END) AS Матем,
SUM(value) AS Сумма
FROM ...
GROUP BY fio
Lasciate ogni speranza, voi ch'entrate.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 08.08.2006 (Вт) 15:57

Судя по характерным заголовкам столбцов, подозрительно смахивающим на таковые в QA, я делаю вывод, что речь скорее всего идет о MS SQL Server. Остается только выяснить, о какой именно версии идет речь, ибо в данном случае разница является ключевой - в MSSQL 2005 появилось средство для построения кросстабов (PIVOT / UNPIVOT), в то время как в 2000 приходится делать вручную - через жестко прописанный case.

http://www.sql.ru/forum/actualthread.aspx?tid=128516, пункт 10 :)

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 08.08.2006 (Вт) 16:00

Да, это mssql. Сенкс, этот способ сгодится. Но вроде как-то можно без case, хитрыми join'ами? Хотелось бы узнать как, для общего развития.
Лучший способ понять что-то самому — объяснить это другому.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 08.08.2006 (Вт) 16:07

Ennor
+1 за внимательность :D
До 2005го нам еще далеко, а до перекрестных запросов ваще как до Луны. Тот пункт уже видел, но механизм перекрестных запросов ускользает от моего понимания. Знаешь какую-нибудь ссылку, где на пальцах все это объясняется?
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение alibek » 08.08.2006 (Вт) 16:09

Можно и джойнами, но я бы не стал. Это будет основная таблица и несколько дублей, по одному на каждый столбец. CASE удобнее.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение Konst_One » 08.08.2006 (Вт) 16:10

для этого и был создан MS OLAP Server :)

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 08.08.2006 (Вт) 16:10

И все-таки?...
Лучший способ понять что-то самому — объяснить это другому.

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

Сообщение Konst_One » 08.08.2006 (Вт) 16:10

MDX - язык кубических запросов

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

Сообщение Konst_One » 08.08.2006 (Вт) 16:12


Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 08.08.2006 (Вт) 19:56

Не стану начинать ещё один топик с таким же названием, поэтому спрошу здесь. Надеюсь Antonariy не против.
Субд MySql
Есть 2 одинаковых таблицы с разными значениями в столбцах. Записей в них одинаковое количество. Собственно какой запрос нужен для того чтобы все значения одного из столбцов первой таблицы перенести в одноимённый столбец другой таблицы?
Если всё делать своими ручками, они скоро отвалятся !

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 08.08.2006 (Вт) 20:01

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

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 08.08.2006 (Вт) 21:27

insert into tbl (fld ...) select fld ... from tbl2
Если я правильно понял.
Лучший способ понять что-то самому — объяснить это другому.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 08.08.2006 (Вт) 21:46

Я понял, что между строками существует взаимно-однозначное соответствие, не отражённое нигде, кроме как в "позиции строки".
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 09.08.2006 (Ср) 0:07

Не, не так.
Таблицы примерно следующего вида
Код: Выделить всё
'1 таблица
Id | Name | Class | ещё 30 полей
1  | Rabbit | Monster |
2  | Dragon | Boss  |

Код: Выделить всё
'2 таблица
Id | Name | Class | ещё 30 полей
1  | Rabbit | RaidBoss |
2  | Dragonkin | Guardian  |


Где ID ключевое поле- счётчик. При этом ID соответсвующих записей обоих таблиц совпадают.
Собственно надо заменить допустим значения столбца Class первой таблицы значениями этого же столбца, но второй таблицы.
Т.е. в результате должно получится примерно
Код: Выделить всё
Id | Name | Class | ещё 30 полей
1  | Rabbit | RaidBoss |
2  | Dragon | Guardian  |

Надеюсь объяснил понятно.
P.S. Запрос Antonariy к сожалению не прошёл :roll:
Если всё делать своими ручками, они скоро отвалятся !

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 09.08.2006 (Ср) 0:17

Код: Выделить всё
UPDATE table2
SET class = table1.class
FROM table1 INNER JOIN table2 ON table1.ID = table2.ID
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 09.08.2006 (Ср) 0:27

Не помогло. :roll:
Error
SQL query:

UPDATE npc2 SET class = npc.class FROM npc INNER JOIN npc2 ON npc.ID = npc2.ID

MySQL said:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM npc INNER JOIN npc2 ON npc.ID = npc2.ID' at line 1

Если всё делать своими ручками, они скоро отвалятся !

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 09.08.2006 (Ср) 0:34

Хм.
Да.
Не следовало всё-таки задавать вопрос про недобазу в топике про MS SQL.

Код: Выделить всё
UPDATE table1, table2
SET table2.class = table1.class
WHERE table1.ID = table2.ID


Кстати, в мануале по MySQL приводится пример:
Код: Выделить всё
UPDATE items,month
SET items.price=month.price
WHERE items.id=month.id;

Найдите 10 отличий...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 09.08.2006 (Ср) 0:44

GSerg
Kovu писал(а):Субд MySql

Извиняюсь за тупость. Оказывается я уже давно сделал нужный запрос. Теперь переделал и с Inner JOin (from надо убрать) Просто он писал результат "0 Rows affected" ибо я тестил на абсолютно идентичных таблицах =)
Если всё делать своими ручками, они скоро отвалятся !

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 14.08.2006 (Пн) 10:57

Здравствуйте!
Наверное, опять Шаман меня ругать будет, :lol: но дело требует обращения за помощью.

Private Sub Command1_Click()
MousePointer = 11
With Adodc1
.RecordSource = "INSERT INTO TMP SELECT DISTINCT Title FROM tblPedagog order by Title"
.Refresh
MousePointer = 0
End With
End Sub

Вроде как бы работает, перенося в таблицу TMP содержимое поля Title.

Однако, замысел был иной.
Надо, чтобы запрос выбрал неповторяющиеся записи по полю Title (как это сейчас), но перенс их в таблицу TMP со всеми остальными полями, которые идентичны для обеих таблиц (например, Name, Rank,Number,City,Year)/

Не подскажите, где и что надо дописать в этот код?
Спасибо!

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

Сообщение Konst_One » 14.08.2006 (Пн) 11:16

Код: Выделить всё
INSERT INTO TMP ([Name], Rank, [Number], City, [Year], Title)
SELECT
  MIN(Name) as Name,
  MIN(Rank) as Rank,
  MIN([Number]) as [Number],
  MIN(City) as City,
  MIN([Year]) as [Year],
  Title
FROM tblPedagog
GROUP BY Title

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 14.08.2006 (Пн) 11:52

Konst_One
Спасибо за ответ!
Следуя твоему совету, я внес изменения в код:

Private Sub Command5_Click()
MousePointer = 11
Adodc1.RecordSource = "INSERT INTO TMP (Name, Rank, Number, City, Year, Title) SELECT MIN(Name) AS Name, MIN(Rank) AS Rank, MIN(Number) AS Number, MIN(City) AS City, MIN(Year) AS Year, Title From tblPedagog GROUP BY Title"

Adodc1.Refresh
MousePointer = 0
End Sub

Не знаю, что получится в конце, так как я, видимо, исказил твое предложение. У меня выходит ошибка синтаксиса в INSERT INTO
Пока я так и не понял, что я сделал не по-твоему.
Спасибо!
Последний раз редактировалось Summer.05 14.08.2006 (Пн) 11:55, всего редактировалось 1 раз.

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

Сообщение Konst_One » 14.08.2006 (Пн) 11:55

INSERT INTO TMP (Name, Rank, Number, City, Year, Title)

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 14.08.2006 (Пн) 11:56

Konst_One
Да, друг, я уже поставил скобки с обеих сторон, но ошибка - та же...

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

Сообщение Konst_One » 14.08.2006 (Пн) 12:00

Код: Выделить всё
Dim cn as ADODB.Connection

Set cn=New ADODB.Connection
cn.ConnectionString = ....

SQL=...

cn.execute SQL

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

Сообщение Konst_One » 14.08.2006 (Пн) 12:01

ADODC - тут вообще неуместен :!:

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 14.08.2006 (Пн) 12:31

Konst_One
Знаешь, я не работал в SQL и плохо понимаю его принципы.

Private Sub Command5_Click()
Dim strPath As String
strPath = App.Path & "/" & "DB/dbped.mdb"
MousePointer = 11
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Persist Security Info=False;Data Source=" & strPath & _
"; Mode=Read|Write"

SQL = "INSERT INTO TMP ([Name], Rank, [Number], City, [Year], Title)SELECT MIN(Name) AS Name, MIN(Rank) AS Rank, MIN([Number]) AS [Number], MIN(City) AS City, MIN([Year]) AS [Year], Title From tblPedagog GROUP BY Title"

cn.Execute SQL
End Sub


Наверняка здесь есть ошибка, так как мне выдается сообщение, что SQL = variable not defined
Спасибо за твою помощь!

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

Сообщение alibek » 14.08.2006 (Пн) 12:38

Да, есть такое.
Есть вставка данных. Например:
Код: Выделить всё
INSERT VALUES (1,2,3) INTO Table1

или
Код: Выделить всё
INSERT INTO Table1 (c1,c2,c3) SELECT col1, col2, col2 FROM Table2


Есть выборка. Например:
Код: Выделить всё
SELECT col1, col2, col3 FROM Table1

или
Код: Выделить всё
SELECT col1, Count(col2), Sum(col3) FROM Table1 GROUP BY col1


Но ты пытаешься сделать что-то непонятное.
Не понял, что тебе нужно, но MIN() у тебя скорее всего лишний. Если тебе нужно исключить вставку дубликатов, лучше используй SELECT DISTINCT или SELECT DISTINCTROW.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение alibek » 14.08.2006 (Пн) 12:40

Да, а чтобы не было ошибки, объяви переменную SQL, Dim SQL As String.
Lasciate ogni speranza, voi ch'entrate.

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 14.08.2006 (Пн) 12:50

alibek
Здравствуй, Большой Человек! :)

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

Private Sub Command1_Click()
MousePointer = 11
With Adodc1
.RecordSource = "INSERT INTO TMP SELECT DISTINCT Title FROM tblPedagog order by Title"
.Refresh
MousePointer = 0
End With
End Sub

Вроде как бы работает, перенося в таблицу TMP содержимое поля Title.

Однако, замысел был иной.
Надо, чтобы запрос выбрал неповторяющиеся записи по полю Title (как это сейчас), но перенес их в таблицу TMP со всеми остальными полями, которые идентичны для обеих таблиц (например, Name, Rank,Number,City,Year)

Не подскажите, где и что надо дописать в этот код?
Спасибо!

След.

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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList