Таблица группы (вертикальная в горизонтальную) | |
---|---|
VeterVFP Автор Сообщений: 413 Откуда: Москва Дата регистрации: 26.12.2006 |
Приветствую.
Есть вертикальная таблица с номерами, объединенными в группы:
Я так понимаю, что-то типа транспонирования, но мне ничего агрегатного не нужно, лишь цепочку. Можно ли SQL-ем или придется таки цикл крутить по номерам? Т.е. из Grps_Vert получить Grps_Horiz
|
Re: Таблица группы (вертикальная в горизонтальную) | |
---|---|
PaulWist Сообщений: 14625 Дата регистрации: 01.04.2004 |
Транспорировать надо в фоксе?
Если в MSSQL, то Pivot. ------------------ Есть многое на свете, друг Горацио... Что и не снилось нашим мудрецам. (В.Шекспир Гамлет) |
Re: Таблица группы (вертикальная в горизонтальную) | |
---|---|
spinz Сообщений: 5263 Дата регистрации: 21.01.2016 |
нифига не понял, но лефтджойн по полю группы разве не?
------------------ Позовите санитаров |
Re: Таблица группы (вертикальная в горизонтальную) | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Требует уникальности Nomer в рамках каждой отдельной группы, иначе некоторая лажа в результате будет. Если исходные данные не отвечают таким условиям, прогони их через группировку или банальный DISTINCT. К "транспонированию", т.е. "повороту", превращению записей в поля, а полей в записи это не имеет никакого отношения. P.S. Это определённый вариант картезианского произведения ("уполовиненный" по сути), т.е. если в группе будет, скажем, 100 записей, то в итоговой выборке их станет уже около 5 тысяч ------------------ WBR, Igor Исправлено 1 раз(а). Последнее : Igor Korolyov, 11.05.18 18:52 |
Re: Таблица группы (вертикальная в горизонтальную) | |
---|---|
of63 Сообщений: 25256 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
В формате SELECT-запорса опять не осилил...
В примере ТС, вероятно, полагается, что: - для каждой группы (Gr) записей (группы никак не пересекаются друг с другом) надо получить - все возможные комбинации пар значений (Nomer) Т.к. группы не пересекаются, то можно все это изложить просто до попарного перебора. Схематично:
|
Re: Таблица группы (вертикальная в горизонтальную) | |
---|---|
VeterVFP Автор Сообщений: 413 Откуда: Москва Дата регистрации: 26.12.2006 |
Пардон, по ошибке залепил тему не в тот раздел. Просьба в ФОКС перенести!.
Нужно все это в VFP9. Игорь верно понял - похоже, получилось то, что надо! Спасибо! Исправлено 1 раз(а). Последнее : VeterVFP, 14.05.18 12:47 |
Re: Таблица группы (вертикальная в горизонтальную) | |
---|---|
VeterVFP Автор Сообщений: 413 Откуда: Москва Дата регистрации: 26.12.2006 |
Появилось доп условие для отбора по наличию признака у номера.
Репро такой:
Сделал условие отбора (в ветке ELSE) - список получается верный по сути, но с дублированием пар, где у обоих номеров признак одинаковый (только зеркально). Т.е. из репро получается такие дубли:
2 moderators: Перекиньте тему в раздел Фокса, плиз! |
Re: Таблица группы (вертикальная в горизонтальную) | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Ну так ты ж сам написал во 2 запросе <> вместо < в первом... Так получается картезианское произведение за вычетом "диагонали" сам-с-собой соединённых.
Кроме того, где условие C2.Prizn = m.cPr ? Я так понимаю надо ж "только из подходящих" пары составлять, а не "подходящие со всеми остальными"... Кроме того, при штатной установке SET ANSI OFF второй запрос будет работать идентично первому, если в m.cPr будет пустая строка (сравнение до исчерпания более короткой строки - для "пустой" строки это значит что ограничения по сути нет вообще). Кстати, именно по этой причине стоит при задании cPR для этого запроса всегда его явно дополнять до размера поля - а то пропишешь там "А" и он бодро возьмёт и "А" и "АА" и "АБ" из таблицы... ------------------ WBR, Igor |
Re: Таблица группы (вертикальная в горизонтальную) | |
---|---|
VeterVFP Автор Сообщений: 413 Откуда: Москва Дата регистрации: 26.12.2006 |
Нет, как раз надо "подходящие со всеми остальными"! Поэтому и условие только по C1.Prizn. Т.е. результат почти нужный, за исключением этих "зеркальных" дублей, которых может получиться много. Вот и не пойму, как их убрать. Да, это в реальном коде я предусмотрел. Да и пустая по
|
Re: Таблица группы (вертикальная в горизонтальную) | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Не вижу логики. Если смотреть "без дублей", то пара должна быть НЕУПОРЯДОЧЕННОЙ - т.е. 1.1-1.2 и 1.2-1.1 по сути одно и то же. и тогда признак учитывать нужно "с обоих сторон". Если же признак учитывается лишь с одной стороны, то твой "результат" сразу некорректен. Где пара АА/1.1 - BB/1.2? И тогда корректное условие должно иметь смысл "хотя бы с одной стороны есть АА" - но никак не "слева есть, справа нет". Хотя в любом случае это неправильно... Если ЕСТЬ разница между "сторонами", то и результат должен быть "упорядоченным", и 1.1-1.2 и 1.2-1.1 автоматически становятся РАЗНЫМИ парами... Ну да если "очень хочется", добавь условие OR C2.Prizn = m.cPr вместе с условием C1.Nomer < C2.Nomer. Да, некоторые пары будут "перевёрнуты", но какая разница, если это именно "просто пара", т.е. сочетание двух элементов одного и того-же смысла. Если нужно именно "упорядоченное" (1.1-1.2 и 1.2-1.1 это совершенно разная штука) - другая задача получается. Наверное через UNION можно сделать. Речь про то что задача решалась бы ОДНИМ универсальным запросом, безо всяких IF. ------------------ WBR, Igor |
Re: Таблица группы (вертикальная в горизонтальную) | |
---|---|
VeterVFP Автор Сообщений: 413 Откуда: Москва Дата регистрации: 26.12.2006 |
Игорь, именно так и надо, т.е. "справа" или "слева" пара - неважно: АА/1.1 - АА/1.2 будет равносильна АА/1.2 - АА/1.1 и именно поэтому и считаются они дублями, которые мне и нужно убрать. Т.е. можно оставить любой вариант из них - сторона "лево" или "право" не важно. Конечно удобнее было бы с одной стороны иметь все записи по этому признаку, но ПОКА это не существенно. Хм. Не понял, в репро в результатном курсоре вижу эту пару. Ты про такой вариант?
Или я не понял твою мысль? |
Re: Таблица группы (вертикальная в горизонтальную) | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
В тексте ты её не указал - вот я и в затруднении - нужна она или уже нет Нет, не так.
Разница между запросом с cPr="AA" и cPr="" лишь в записи BB/1.2-CC/1.4, где ни с одной ни с другой стороны нет нужного АА. И да, этот запрос ОДИН работает и для заданного и для не заданного (пустого) cPr - лишь бы настройка SET ANSI была в OFF (как оно и есть по умолчанию). Никаких IF не требуется. ------------------ WBR, Igor |
Re: Таблица группы (вертикальная в горизонтальную) | |
---|---|
VeterVFP Автор Сообщений: 413 Откуда: Москва Дата регистрации: 26.12.2006 |
Игорь, вроде уловил - переделал на 1 запрос. Пока не вижу нестыковок в результатах
Спасибо! Единственное, что, т.к. это все на свободных ДБФах построено, то при больших выборках начинает зависать прога (а там полу-картезианское может достигать 10ки млн ). И даже когда я делал сохранение в CSV
Исправлено 2 раз(а). Последнее : VeterVFP, 22.05.18 13:39 |
Re: Таблица группы (вертикальная в горизонтальную) | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
10М это прилично. Особенно если без оптимизации - т.е. если по ходу дела фокс генерит 100М и без индексов отбрасывает "ненужные" записи - скажем те что "между группами" образуются. А просто выброска dbf в csv (независимо от того free таблица или нет, досовская она или виндовая) - не должна тормозить. Тут если что и мешает, то это вне фокса (АВ, слабая сеть, дохлый жёсткий диск).
------------------ WBR, Igor |
© 2000-2024 Fox Club  |