[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Массив
Nigina
Пожалуйста помогите с запросом.
У меня три таблицы.
1.
SQL
abonent
//Абоненты - фамилия, имя и т.д.
2.
SQL
plata_abonent
//Дата оплаты, сумма.
3.
SQL
month
//месяц.

Всё для отчета.
SQL
select 
`abonent`.`surname`, 
`abonent`.`name`, 
`oplata_abonent`.`summa`,
`oplata_abonent`.`date`, 
`month`.`name` as total 
from `abonent`
 inner join `oplata_abonent` on (`abonent`.`dogovor`=`oplata_abonent`.`id_abonenta`) 
inner join `month` on (`oplata_abonent`.`monthoplati`=`month`.`month`)
 where `oplata_abonent`.`summa`!='' and `oplata_abonent`.`date` 
BETWEEN '2009-06-01' AND '2009-06-15' ORDER BY `oplata_abonent`.`date`



Запрос работает, но бывает так что абонент платит сразу за два месяца. Хочу в одном столбце сразу через запятой показывал месяцы, а не два раза выводил абонента.
У меня вот так получается:
SQL
surname name summa date total
www eee 130.00 2009-06-01 Июнь
www eee 231.00 2009-06-02 Июль
www eee 260.00 2009-06-09 Август
www eee 70.00 2009-06-11 Сентябрь


А мне примерно надо так:

SQL
surname name summa date total
www eee 130.00 2009-06-01 Июнь
231.00 2009-06-02 Июль
260.00 2009-06-09 Август
70.00 2009-06-11 Сентябрь


/*
SQL
surname: www
name: eee
summa: 130.00, 231.00,260.00, 70.00,
date: 2009-06-01, 2009-06-02, 2009-06-09, 2009-06-11
total: Июнь,Июль,Август,Сентябрь
*/

Пожалуйста помогите.



Спустя 2 часа, 39 минут, 35 секунд (15.06.2009 - 13:24) Oyeme написал(а):
таким способом :


declare @tmp varchar(250)
SQL
SET @tmp = ''
select @tmp = @tmp + date + ', ' from #abonent


SQL
select SUBSTRING(@tmp, 0, LEN(@tmp))


20.04.2004
20.04.2003
20.04.2001

Result : 20.04.2004 , 20.04.2003 ,20.04.2001

Спустя 26 минут, 57 секунд (15.06.2009 - 13:51) sergeiss написал(а):
Цитата (Oyeme @ 15.06.2009 - 14:24)
таким способом :


declare @tmp varchar(250)
SQL
SET @tmp = ''
select @tmp = @tmp + date + ', ' from #abonent select SUBSTRING(@tmp, 0, LEN(@tmp))


20.04.2004
20.04.2003
20.04.2001

Result : 20.04.2004 , 20.04.2003 ,20.04.2001

А я вот что-то не понял, каким образом этот запрос будет работать... Можно пояснить?

Спустя 7 минут, 34 секунды (15.06.2009 - 13:59) Oyeme написал(а):
Цитата (sergeiss @ 15.06.2009 - 10:51)
Цитата (Oyeme @ 15.06.2009 - 14:24)
таким способом :


declare @tmp varchar(250)
SQL
SET @tmp = ''
  select @tmp = @tmp + date + '
, ' from #abonent select SUBSTRING(@tmp, 0, LEN(@tmp))


20.04.2004
20.04.2003
20.04.2001

Result : 20.04.2004 , 20.04.2003 ,20.04.2001

А я вот что-то не понял, каким образом этот запрос будет работать... Можно пояснить?

Создаеться процедура которая плюсует строки,через запятую.

Пример


magine you have a column like this:

Numbers
---------
One
Two
Three
Four
Five

The output you desire is to combine all the rows and put it as one row similar to the following:

One|Two|Three|Four|Five


Let us see how to do it:

-- Sample Script to create the table and insert rows
SQL
CREATE TABLE #Temp
(
[Numbers] varchar(40)
)
INSERT INTO #Temp VALUES('One');
INSERT INTO #Temp VALUES('Two');
INSERT INTO #Temp VALUES('Three');
INSERT INTO #Temp VALUES('Four');
INSERT INTO #Temp VALUES('Five');


-- Query to combine multiple rows into one
SQL
DECLARE @str VARCHAR(100)
SELECT @str = COALESCE(@str + ' , ', '') + [Numbers]
FROM #Temp Print @str


You can also achieve the same result using STUFF
SQL
SELECT DISTINCT STUFF( (SELECT '*' + Numbers from #Temp FOR XML PATH('')),1,1,'') as Numbers FROM #Temp

Спустя 13 минут, 27 секунд (15.06.2009 - 14:12) glock18 написал(а):
Цитата (sergeiss @ 15.06.2009 - 10:51)
А я вот что-то не понял, каким образом этот запрос будет работать... Можно пояснить?


Я сам так никогда не делал, но по задумке автора, если я правильно понял, это должно дописывать в переменную @tmp дату... Другой вопрос - будет ли.

SQL
select @tmp = @tmp + date + ', ' from #abonent select SUBSTRING(@tmp, 0, LEN(@tmp))


тут, очевидно, хотели закомментировать #abonent. Запрос так вообще не будет работать.

SQL
select @tmp = @tmp + date + ', ' from select SUBSTRING(@tmp, 0, LEN(@tmp))


Вложенный запрос - очень хорошо напоминает об Индусском коде. Команда
SQL
SUBSTRING(@tmp, 0, LEN(@tmp)
потрясает воображение smile.gif Опять же если не говорить, что здесь вложенный запрос совершенно ни к чему.

Спустя 28 минут, 26 секунд (15.06.2009 - 14:40) Oyeme написал(а):
Цитата (glock18 @ 15.06.2009 - 11:12)
Цитата (sergeiss @ 15.06.2009 - 10:51)
А я вот что-то не понял, каким образом этот запрос будет работать... Можно пояснить?


Я сам так никогда не делал, но по задумке автора, если я правильно понял, это должно дописывать в переменную @tmp дату... Другой вопрос - будет ли.

SQL
select @tmp = @tmp + date + ', ' from #abonent select SUBSTRING(@tmp, 0, LEN(@tmp))


тут, очевидно, хотели закомментировать #abonent. Запрос так вообще не будет работать.

SQL
select @tmp = @tmp + date + ', ' from select SUBSTRING(@tmp, 0, LEN(@tmp))


Вложенный запрос - очень хорошо напоминает об Индусском коде. Команда
SQL
SUBSTRING(@tmp, 0, LEN(@tmp)
потрясает воображение smile.gif Опять же если не говорить, что здесь вложенный запрос совершенно ни к чему.






Это пример ,как Вы можите - это реализовать.

Путём небольшой процедуры который соединияет строки и разделяет их через запятые.

комментарии в sql - (--) , ( { . . . } ) , (/* . . . */)

Спустя 14 минут, 15 секунд (15.06.2009 - 14:55) glock18 написал(а):
Странно. Никогда лично не видел, чтобы # использовалась в имени таблицы. Временные таблички создаются Create Temporary Table, и без всяких "решеточек".

Я использую mysql query browser от Sun - там # используется для комментирования.

Приведенный отрывок статьи напоминает мне mssql (или еще какой sql), но никак не Mysql. Хотя почему я собсно решил, что здесь нужен он... Так показалось из вопроса.

Спустя 19 минут, 37 секунд (15.06.2009 - 15:14) sergeiss написал(а):
Всё это, может быть, и здорово, но не решает основной задачи - как я ее понял. Потому что имеется много-много юзеров, и для каждого нужно создать такую строку.
Для этого я в PostgreSQL создал бы отдельную функцию , куда бы передавал необходимые параметры. Судя по начальному коду, это диапазон дат, месяц, непустая сумма и другие параметры. На выходе получил бы строку с искомыми датами, разделенными запятыми.
И сделал бы там простую выборку, и в цикле формировал бы искомую строку (а не через непонятно как работающую рекурсию). Которая (т.е. строка) потом возвращалась бы в запрос.

Но это в Постгре. А в мюзикле я не знаю, как это сделать, если вообще возможно. Я с ним больше "на Вы" smile.gif

Спустя 17 минут, 53 секунды (15.06.2009 - 15:32) glock18 написал(а):
Ну насчет функций в мускуле все хорошо smile.gif Задача решается так же в целом.

Спустя 19 часов, 41 минута, 32 секунды (16.06.2009 - 11:14) Nigina написал(а):
Цитата (Oyeme @ 15.06.2009 - 10:59)
Цитата (sergeiss @ 15.06.2009 - 10:51)
Цитата (Oyeme @ 15.06.2009 - 14:24)
таким способом :


declare @tmp varchar(250)
SQL
SET @tmp = ''
  select @tmp = @tmp + date + '
, ' from #abonent select SUBSTRING(@tmp, 0, LEN(@tmp))


20.04.2004
20.04.2003
20.04.2001

Result : 20.04.2004 , 20.04.2003 ,20.04.2001

А я вот что-то не понял, каким образом этот запрос будет работать... Можно пояснить?

Создаеться процедура которая плюсует строки,через запятую.

Пример


magine you have a column like this:

Numbers
---------
One
Two
Three
Four
Five

The output you desire is to combine all the rows and put it as one row similar to the following:

One|Two|Three|Four|Five


Let us see how to do it:

-- Sample Script to create the table and insert rows
SQL
CREATE TABLE #Temp
(
[Numbers] varchar(40)
)
INSERT INTO #Temp VALUES('One');
INSERT INTO #Temp VALUES('Two');
INSERT INTO #Temp VALUES('Three');
INSERT INTO #Temp VALUES('Four');
INSERT INTO #Temp VALUES('Five');


-- Query to combine multiple rows into one
SQL
DECLARE @str VARCHAR(100)
SELECT @str = COALESCE(@str + ' , ', '') + [Numbers]
FROM #Temp Print @str


You can also achieve the same result using STUFF
SQL
SELECT DISTINCT STUFF( (SELECT '*' + Numbers from #Temp FOR XML PATH('')),1,1,'') as Numbers FROM #Temp

У меня не чего не получилось.

Спустя 5 часов, 30 минут, 34 секунды (16.06.2009 - 16:44) Alchemist написал(а):
не надо возиться с процедурами и переменными... все что вам надо - это GROUP_CONCAT(). А вот по какаим параметрам группировать, смотрите сами - это из вашего поста не ясно...

Спустя 20 часов, 44 минуты, 49 секунд (17.06.2009 - 13:29) Nigina написал(а):
Цитата (Alchemist @ 16.06.2009 - 13:44)
не надо возиться с процедурами и переменными... все что вам надо - это GROUP_CONCAT(). А вот по какаим параметрам группировать, смотрите сами - это из вашего поста не ясно...

Спасибо. Всё получилось.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.