powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / можно ли обойтись зпаросом? ASE12.5.4
16 сообщений из 16, страница 1 из 1
можно ли обойтись зпаросом? ASE12.5.4
    #34989794
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа, такая задачка:
table1
field1 field2
a 1a
a 2a
a 3a
b 1b
b 2b
....

n xn

Нужно получить такой результат:

field1 field2
a 1a2a3a
b 1b2b
...
n 1n2n..xn

сгруппировать для каждого field1 все значения field2 в виде одной строки. По сути получить Pivot таблицу.

Можно ли подобную задачку решить при помощи запроса или перебора всех записей в курсоре не избежать?

Заранее спасибо.
...
Рейтинг: 0 / 0
можно ли обойтись зпаросом? ASE12.5.4
    #34989843
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kru пишет:
> Можно ли подобную задачку решить при помощи запроса или перебора всех
> записей в курсоре не избежать?

Не избежать. Но на самом деле такого вообще по уму не надо делать никогда.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
можно ли обойтись зпаросом? ASE12.5.4
    #34990088
Фотография Рыжий Кот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
самое интересно, что ASA позволяет это сделать

Код: plaintext
1.
2.
SELECT field1, list(field2, '') FROM "DBA"."table2"

group by field1
...
Рейтинг: 0 / 0
можно ли обойтись зпаросом? ASE12.5.4
    #34990432
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как собрать в одну строку значения из N записей

_________________
"Helo, word!" - 17 errors 56 warnings
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
можно ли обойтись зпаросом? ASE12.5.4
    #34992808
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ex_Soft
Как собрать в одну строку значения из N записей

_________________
"Helo, word!" - 17 errors 56 warnings
Posted via ActualForum NNTP Server 1.4

Прикольная фича, хотя она задачку не решает, т.к. группировок с её помощью группировок не сделаешь.
...
Рейтинг: 0 / 0
можно ли обойтись зпаросом? ASE12.5.4
    #34992949
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ex_Soft
Как собрать в одну строку значения из N записей

_________________
"Helo, word!" - 17 errors 56 warnings
Posted via ActualForum NNTP Server 1.4

Задачу немного поменяли и фича очень пригодилась : -)

Большое спасибо!

Теоретически интересно можно ли сделать настоящую Pivot таблицу -так чтобы строки стали столбцами - средствами ASE?
...
Рейтинг: 0 / 0
можно ли обойтись зпаросом? ASE12.5.4
    #34994573
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kru пишет:
> Теоретически интересно можно ли сделать настоящую Pivot таблицу -так
> чтобы строки стали столбцами - средствами ASE?

Это надо на клиенте делать, зачем вам этой ерундой сервер мучать ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
можно ли обойтись зпаросом? ASE12.5.4
    #34994747
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Kru пишет:
> Теоретически интересно можно ли сделать настоящую Pivot таблицу -так
> чтобы строки стали столбцами - средствами ASE?

Это надо на клиенте делать, зачем вам этой ерундой сервер мучать ?
Posted via ActualForum NNTP Server 1.4

Бывает иногда, что просят разовую выборку. Не будешь же из-за этого целое приложение писать. Инструмент типа бизнес обжектса тоже не всегда под рукой есть.

Отсюда и вопросы. Задача кажется довольно стандартной и наверняка есть готовые решения
...
Рейтинг: 0 / 0
можно ли обойтись зпаросом? ASE12.5.4
    #34994820
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kru пишет:

> Бывает иногда, что просят разовую выборку. Не будешь же из-за этого
> целое приложение писать. Инструмент типа бизнес обжектса тоже не всегда

Crystal Reports.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
можно ли обойтись зпаросом? ASE12.5.4
    #34994831
rcryo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Количество значений а, b, c, d, ... ограничено?
...
Рейтинг: 0 / 0
можно ли обойтись зпаросом? ASE12.5.4
    #34995119
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KruТеоретически интересно можно ли сделать настоящую Pivot таблицу -так чтобы строки стали столбцами - средствами ASE?Можно на любом сервере. Стандартным SQL. Ну почти стандартным :) И почти Pivot :)

1) Делаешь временную таблицу с отдельной колонкой под каждую колонку итогового кросстаба (конечно если заранее количество колонок не известно то прийдется либо извращаться с генерированием ddl-скриптов в рантайме, либо все-же отдавать задачу клиенту). Но если итоговые колонки заранее известны, то все очень просто получается. Например если в задаче надо сделать кросс-таб "продажи по дням недели" делаешь итоговый кросстаб:
Код: plaintext
create table #result(DepartmentCode char( 10 ), Mon money, Tue money, Wed money, Thu money ..., WeeklyTotal money)
Обрати внимание, что последняя колонка - Total - обязательна.

2) В таблице источнике ОБЯЗАТЕЛЬНО должно быть поле однозначно идентифицирующее в какую колонку должно отправится значение. Например:
Код: plaintext
create table #sales(DepartmentCode char( 10 ), DayOfWeek numeric( 1 ), Sales money)

3) Ну а дальше уже все просто, сначала заполняешь Total колонку, это даст тебе все возможные строки в кросстабе:
Код: plaintext
insert into #result (DepartmentCode, WeeklyTotal) select DepartmentCode, sum(Salary) from #sales group by DepartmentCode

4) И последний этап заполняешь середину кросстаба:
Код: plaintext
1.
2.
3.
4.
update #result set
 Mon = (select sum(Sales) from #sales where #result.DepartmentCode=#sales.DepartmentCode and #sales.DayOfWeek= 1 ),
 Tue = (select sum(Sales) from #sales where #result.DepartmentCode=#sales.DepartmentCode and #sales.DayOfWeek= 2 ),
 Wed = (select sum(Sales) from #sales where #result.DepartmentCode=#sales.DepartmentCode and #sales.DayOfWeek= 3 ),
   ....etc




Если колонки заранее известны, но значения могут попасть в любую из них, например в задаче "показать суммы четырех последних продаж". То итоговый кросстаб и заполнение его слегка усложнятся:
1)
Код: plaintext
1.
create #result(DepartmentCode char( 10 ), Date1 date, Amount1 money, Date2 date, Amount2 money,
        Date3 date, Amount3 money, Date4 date, Amount4 money)
Здесь нам колонка Total уже не нужна, потому что в каждой строке у нас будет хотя бы одна продажа (самая последняя) и она будет выполнять роль создавателя строк.

2) Исходная таблица будет такого вида:
Код: plaintext
create table #sales(DepartmentCode char( 10 ), SaleDate date, Amount money)

3) Создаем строки в кросстабе:
Код: plaintext
insert into #result(DepartmentCode, Date1) select DepartmentCode, max(SaleDate) from #sales group by DepartmentCode

4) Заполняем вторую, третью и четвертую дату по принципу: максимальная дата из тех что меньше предыдущей выбранной.
Код: plaintext
1.
2.
update #result set Date2=(select max(SaleDate) from #sales where #result.DepartmentCode=#sales.DepartmentCode and #sales.SaleDate<#result.Date1)
update #result set Date3=(select max(SaleDate) from #sales where #result.DepartmentCode=#sales.DepartmentCode and #sales.SaleDate<#result.Date2)
update #result set Date4=(select max(SaleDate) from #sales where #result.DepartmentCode=#sales.DepartmentCode and #sales.SaleDate<#result.Date3)
Обрати внимание что это три отдельных апдейта. Естественно пятая и дальше даты уходит в никуда, но исходная задача интересуется только четырьмя последними датами, так что это не беда. А если у отдела меньше четырех продаж, то оставшиеся даты станут null'ами. Ну а если у отдела не было продаж вообще, то он и вообще не появится в кросстабе - об этом позаботился предыдущий шаг...

5) Ну и наконец можно заполнить колонки с суммами продаж:
Код: plaintext
1.
2.
3.
update #result set Amount1 = Amount from #sales where #result.DepartmentCode=#sales.DepartmentCode and #sales.SaleDate=#result.Date1
update #result set Amount2 = Amount from #sales where #result.DepartmentCode=#sales.DepartmentCode and #sales.SaleDate=#result.Date2
update #result set Amount3 = Amount from #sales where #result.DepartmentCode=#sales.DepartmentCode and #sales.SaleDate=#result.Date3
update #result set Amount4 = Amount from #sales where #result.DepartmentCode=#sales.DepartmentCode and #sales.SaleDate=#result.Date4
...
Рейтинг: 0 / 0
можно ли обойтись зпаросом? ASE12.5.4
    #34995271
Фотография Zhora
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rcryoКоличество значений а, b, c, d, ... ограничено?
Если это так то тогда используется что-то типа:
select sum(case <colm>=<value1> else 0 end ) col1,
sum(case <colm>=<value2> else 0 end ) col2,
...
sum(case <colm>=<valuen> else 0 end ) coln,
group by <colk1>, <colk2>,...<colkn>, где kn <> m
Или мах вместо sum
...
Рейтинг: 0 / 0
можно ли обойтись зпаросом? ASE12.5.4
    #34995359
Kru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Огромное спасибо.
...
Рейтинг: 0 / 0
можно ли обойтись зпаросом? ASE12.5.4
    #34997751
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl пишет:
> Можно на любом сервере. Стандартным SQL. Ну почти стандартным :) И почти
> Pivot :)

Вся суть-то - в этих "почти". Начиная уже с "создать временную таблицу".
Т.е. по сути - это невозможно.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
можно ли обойтись зпаросом? ASE12.5.4
    #34999068
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivWhite Owl пишет:
> Можно на любом сервере. Стандартным SQL. Ну почти стандартным :) И почти
> Pivot :)

Вся суть-то - в этих "почти". Начиная уже с "создать временную таблицу".
Т.е. по сути - это невозможно.Ну зачем же так категорично? Да, две задачи которые я упомянул не являются полноценными кросстабами, но они встречаются достаточно часто чтобы про них знать и знать что их можно решить не выходя за рамки хранимой процедуры.
Ну а решать их через временные таблицы или через формулы с case в колонках селекта как показал Zhora это уже детали. И все упомянутые решения будут прекрасно работать в нашил любимых серверах и в ASA и ASE.
Полноценный кросстаб - невозможно, кросстабы которые чаще всего нужны заказчикам - вполне возможно.
...
Рейтинг: 0 / 0
можно ли обойтись зпаросом? ASE12.5.4
    #34999378
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl пишет:

> Ну зачем же так категорично? Да, две задачи которые я упомянул не

Да потому что это нифига не обработка данных. Это - обработка представления
данных. Вот и надо ее делать на клиенте. Не, ну тут конечно каждый, так сказать,
хочет, как он хочет.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / можно ли обойтись зпаросом? ASE12.5.4
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]