Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как работает GROUP BY в случае отступления от стандартов
|
|||
|---|---|---|---|
|
#18+
Нормальные люди уже "оливье" готовят а я все на работе парюсь :(( Занимаюсь сейчас тем что переписываю старый софт написанный на Фоксе на MS-SQL. Проблема с пониманием работы GROUP BY в случае отступления от стандартов. Вот на Фоксе: SELECT Data, Name, Plan, Count; FROM Cursor1; GROUP BY 2, 1; Естественно что на SQL я так написать не могу. Приходится писать GROUP BY Data, Name, Plan, Count Результат получается отличным от того что требуется (это и понятно - условия группировки то другие). Вопросы: 1. Что Фокс выдает в качестве результата группировки если не указана группировка по неагрегатному полю? Иными словами что он выдаст в приведенном премере в качестве Plan и Count? Я что-то не пойму логику. Предположил было что первое из встретившихся значений, но проверка показала что нет. 2. А как быть в таком случае на MS-SQL? Единственное что приходит мне в голову это сперва делать SELECT Data, Name, 0 AS Plan, 0 AS Count FROM Tab1 GROUP BY Data, Name а затем загонять таблицу Tab1 в курсор и апдейтить результат выборки подставляя первые Plan и Count соответствующие условию. Но способ очень медленный. Да и не за тем используется SQL чтобы гонять на нем курсоры. 3. Суммируя два предыдущих вопроса как написать на SQL выборку соответствующую Фоксовской??? Огромнейшее спасибо. P.S. Все таки стандарты это хорошо !!!!! P.P.S. Всех с наступающим на пятки Новым Годом ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2003, 13:20 |
|
||
|
Как работает GROUP BY в случае отступления от стандартов
|
|||
|---|---|---|---|
|
#18+
Когда в FoxPro используется синтаксис типа Код: plaintext 1. 2. То при этом предполагается, что значение полей Plan, Count одинаково в пределах одной группы (при одинаковых значениях Data и Name). Т.е. абсолютно все-равно какое именно значение будет взято, поскольку оно будет одинаковое. Это значит, что вместо полей Plan и Count можно указать любую функцию аггрегирования и это никак не повлияет на результат. Ну например: Код: plaintext 1. 2. Если кроме перечисленных полей есть какие-либо функции аггрегирования, то можно просто включить список этих полей в список GROUP BY. Результат будет тот же. Если же в приложении FoxPro заложились на то, что в пределах одной группы значение полей Plan и Count может быть различно (кажется берется последнее значение из группы, хотя не уверен), то это неверно построенный запрос. Просто нельзя ориентироваться на физическое расположение записей в операторах Select-SQL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2003, 14:05 |
|
||
|
Как работает GROUP BY в случае отступления от стандартов
|
|||
|---|---|---|---|
|
#18+
Маленький комментарий: в случае когда Plan или Count в пределах группы могут иметь разные значения, FoxPro возьмет то значение, какое ему попадется "под руку" (не обязательно первое или последнее физически, ведь как таковой физический порядок в SQL не применим). В принципе, это отступление от стандарта позволяет писать более компактные по количеству кода запросы, но и является источником возникновения логических ошибок. ВладимирМ совершенно правильно охарактеризовал твою ситуацию как неверно построенный запрос. Я думаю, что в этом случае тебе надлежит абстрагироваться от кода и подняться на уровень бизнес-логики. И понять, а какова, собственно, роль этого запроса в приложении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2003, 15:42 |
|
||
|
Как работает GROUP BY в случае отступления от стандартов
|
|||
|---|---|---|---|
|
#18+
Покрайней мере в VFP6 всегда возвращалось последнее значение. Это если на основе только что сформированного курсора (используется в комерческам продукте и глюков замечено небыло), а что творится когда на таблицу да еще с индексами не знаю ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.01.2004, 12:02 |
|
||
|
Как работает GROUP BY в случае отступления от стандартов
|
|||
|---|---|---|---|
|
#18+
Вот ужас ((((( У себя сейчас проверил, запрос неверно отрабатывает данные. Вопрос ко всем, разобраться не могу, туплю наверное, как реализовать правильно запрос такого типа: Select Name_tv, Izgot, Min(Cena+Nac) as Cena, Par_1, Par_2; From Sklad; Group by Name_tv, Izgot; into table Uni_Name_Izgot Чтобы в результирующую таблицу выводились строки с минимальной ценой но сооветсвующими параметрами Par_1, Par_2 именно для этих строк ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2004, 12:28 |
|
||
|
Как работает GROUP BY в случае отступления от стандартов
|
|||
|---|---|---|---|
|
#18+
авторкак реализовать правильно запрос такого типа: Select Name_tv, Izgot, Min(Cena+Nac) as Cena, Par_1, Par_2; From Sklad; Group by Name_tv, Izgot; into table Uni_Name_Izgot Есть только два пути: или объявить Par_1 и Par_2 полями группировки, или объявить их полями агрегирования. В первом случае запрос примет такой вид: Код: plaintext 1. 2. 3. Во втором - например, такой: Код: plaintext 1. 2. 3. А вот как надо - это вам решать. Исходя из постановки задачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2004, 13:11 |
|
||
|
Как работает GROUP BY в случае отступления от стандартов
|
|||
|---|---|---|---|
|
#18+
Спасибо. К сожалению это решение к моей задаче не применимо: Par_1, Par_N - их у меня полей 15 - это харектеристики товара не поддающиеся функции агрегатирования. Вообщем на русском задача звучит так: из остатков товара на складе сформировать прайс-лист в котором наименование и изготовитель уникальны, а цена минимальна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2004, 13:34 |
|
||
|
Как работает GROUP BY в случае отступления от стандартов
|
|||
|---|---|---|---|
|
#18+
В догонку: эта строка (с минимальной ценой) должа содержать характеристики товара именно этой строки... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2004, 13:36 |
|
||
|
Как работает GROUP BY в случае отступления от стандартов
|
|||
|---|---|---|---|
|
#18+
Если я правильно понял, то существуют несколько записей о, в общем, одном и том же товаре, но с разными параметрами. Это как при продаже автомобилей - есть некая базовая комплектация, на которую навешивается определенная дополнительная функциональность: цвет металлик - плюс 100 долларов, наличие крутой аудиосистемы - еще двести... И вот получается, что в вашем случае нет базовой комплектации, а вместо нее есть сочетание параметров, дающее минимальную цену. И в запросе задача - выдать значения этих параметров рядом с каждой минимальной ценой. Ну так нет ничего проще ;-) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Запрос плохой, оставлено широчайшее поле для оптимизации. Но по синтаксису в VFP проходит, а нужна была, как я понимаю, только сама идея запроса. На самом деле, необходимость придумывать нестандартные запросы, как правило, говорит о том, что сама структура БД запроектирована не совсем правильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2004, 14:16 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=32419433&tid=1597130]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
51ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 241ms |
| total: | 366ms |

| 0 / 0 |
