powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запрос для MS SQL
15 сообщений из 15, страница 1 из 1
Запрос для MS SQL
    #37093999
Valerii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
народ,
Что-то не догоняю
есть таблица, в ней есть данные по клиентам , данные были собранны из разных таблиц, которые корректировались.
Они были объеденены и получилась одна таблица в которой ID клиента повторяются, некоторые поля для одно и того же кода заполнены и пустые.
что-то типа вот этого:
ID FISC
197082 2000021048737
197082
197096
197096 992106896549
198269 970807362497
198269
198271
198271
Нужен запрос который выдернит уникальные но ВСЕ ID!!!! и отберет только те записи по полю FISC которое не пустое для данного клиента, но а если оно пустое, тогда пустое значение для этого кода. То есть результат должен выглядеть таким образом:

ID FISC
197082 2000021048737
197096 992106896549
198269 970807362497
198271
Я почти придумал, но и ваши решения также интересны.
Спасибо всем.
...
Рейтинг: 0 / 0
Запрос для MS SQL
    #37094006
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valerii,

Код: plaintext
select ID, max(FISC) from ... group by ID
...
Рейтинг: 0 / 0
Запрос для MS SQL
    #37094011
Valerii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey SizovValerii,

Код: plaintext
select ID, max(FISC) from ... group by ID


FISC символьное поле!.....
Там есть разные значения....
...
Рейтинг: 0 / 0
Запрос для MS SQL
    #37094014
Valerii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValeriiSergey SizovValerii,

Код: plaintext
select ID, max(FISC) from ... group by ID


FISC символьное поле!.....
Там есть разные значения....

Там же есть еще несколько столбцов которые нужны.
...
Рейтинг: 0 / 0
Запрос для MS SQL
    #37094015
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValeriiSergey SizovValerii,

Код: plaintext
select ID, max(FISC) from ... group by ID


FISC символьное поле!.....И что это меняет?Там есть разные значения....А представленный запрос рассчитан на одинаковые значения?
...
Рейтинг: 0 / 0
Запрос для MS SQL
    #37094018
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValeriiValeriiпропущено...


FISC символьное поле!.....
Там есть разные значения....

Там же есть еще несколько столбцов которые нужны.Спасибо. Вас не учили объявлять сразу все условия задачи, а не выдавать их по одному на каждый вариант ответа?
Присоедините Вашу таблицу еще раз. Но это уже сами или потрудитесь таки привести все условия задачи и в нормальном для технического форума виде, то есть с кодом генерации таблицы и исходных данных.
...
Рейтинг: 0 / 0
Запрос для MS SQL
    #37094026
Valerii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey SizovValeriiпропущено...


FISC символьное поле!.....И что это меняет?Там есть разные значения....А представленный запрос рассчитан на одинаковые значения?

Не совсем корректно выразился, есть еще несколько столбцов, у которых также не одинковые значения для конкретного клиента, но их нужно также "добавить" к результату, адрес, телефон, нас. пункт. Для одного клиента могут быть вбиты по-разному, но для этих полей меня устраивает любое значение. Также брать с MAX(Field_1),MAX(Field_2),...MAX(Field_n) .... GROUP BY Field_1,Field_2,...Field_n?
...
Рейтинг: 0 / 0
Запрос для MS SQL
    #37094029
Valerii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValeriiSergey Sizovпропущено...
И что это меняет?пропущено...
А представленный запрос рассчитан на одинаковые значения?

Не совсем корректно выразился, есть еще несколько столбцов, у которых также не одинковые значения для конкретного клиента, но их нужно также "добавить" к результату, адрес, телефон, нас. пункт. Для одного клиента могут быть вбиты по-разному, но для этих полей меня устраивает любое значение. Также брать с MAX(Field_1),MAX(Field_2),...MAX(Field_n) .... GROUP BY Field_1,Field_2,...Field_n?

Также есть один столбец типа Bit... его конечно можно потом приклеить, но в фоксе такая задача решается в один пинок.
...
Рейтинг: 0 / 0
Запрос для MS SQL
    #37094031
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValeriiSergey Sizovпропущено...
И что это меняет?пропущено...
А представленный запрос рассчитан на одинаковые значения?

Не совсем корректно выразился, есть еще несколько столбцов, у которых также не одинковые значения для конкретного клиента, но их нужно также "добавить" к результату, адрес, телефон, нас. пункт. Для одного клиента могут быть вбиты по-разному, но для этих полей меня устраивает любое значение. Также брать с MAX(Field_1),MAX(Field_2),...MAX(Field_n) .... GROUP BY Field_1,Field_2,...Field_n?Можно и Min(). Все зависит от данных и Ваших желаний. Если поставите Set Enginebahavior 70, то и аггрегатных функций не нужно будет, как раз наугад будет выдавать.
...
Рейтинг: 0 / 0
Запрос для MS SQL
    #37094034
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValeriiТакже есть один столбец типа Bit... его конечно можно потом приклеить, но в фоксе такая задача решается в один пинок.Какая "такая"? Приклеивание? Или что?
...
Рейтинг: 0 / 0
Запрос для MS SQL
    #37094037
Valerii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey SizovValeriiТакже есть один столбец типа Bit... его конечно можно потом приклеить, но в фоксе такая задача решается в один пинок.Какая "такая"? Приклеивание? Или что?

Такая - такого рода задача
Мне нужен запрос для MS SQL Server 2000!!! В Фоксе проблем нет...
...
Рейтинг: 0 / 0
Запрос для MS SQL
    #37094038
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValeriiSergey Sizovпропущено...
Какая "такая"? Приклеивание? Или что?

Такая - такого рода задачаВсе сразу стало понятно. Для понимания рекурсии надо понимать рекурсию.Мне нужен запрос для MS SQL Server 2000!!! В Фоксе проблем нет...Огласите, наконец, ВСЕ условия задачи.
Поле bit и в MS SQL легко "приклеивается".
...
Рейтинг: 0 / 0
Запрос для MS SQL
    #37094156
Valerii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OK. Еще раз.
Есть таблица, которая сформировалась методои объединения из 2 таблиц, которые редактировались вручную, в них правились значения полей клиентв, Адрес, Город, Фискальный код, признак активности.
Структура этой таблицы проста:
ID, Lastname, FirstName, Address, city, fisc, ended - Bit, где уникальный ключ является ID.


После объединения продублировальсь ID и все остальные поля которые для одного и того же ID могут быть разными. То есть мы имеем 2 записи на клиента, с информацией о нем которая хранится в остальных столбцах.
Мне нужно получить набор данных с уникальным кодом ID - тоесть собрать весь список клиентов, но отобрать все остальные записи таким образом чтобы при пустом поле Fisc в одной из записей клиента в набор должна попасть только та, которая содержит в поле FISC хоть какое-то значение. Если обе записи клиента по данному полю окажутся пустыми - то в набор должна попасть любая из этих 2 записей со всеми остальными полями.
ВРоде так...
в Фоксе я бы сделал просто:
SELECT ID, MAX(Fisc) AS Fisc, last_name, first_name, Address, city,Ended FROM SQLRESULT gROUP BY Id
Но для SQL Server это не подойтет такай группировка так как эти поля также разные для отдного и того клиента. Конечно есть исключения - но это явно не тот случай
...
Рейтинг: 0 / 0
Запрос для MS SQL
    #37094186
Valerii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValeriiOK. Еще раз.
Есть таблица, которая сформировалась методои объединения из 2 таблиц, которые редактировались вручную, в них правились значения полей клиентв, Адрес, Город, Фискальный код, признак активности.
Структура этой таблицы проста:
ID, Lastname, FirstName, Address, city, fisc, ended - Bit, где уникальный ключ является ID.


После объединения продублировальсь ID и все остальные поля которые для одного и того же ID могут быть разными. То есть мы имеем 2 записи на клиента, с информацией о нем которая хранится в остальных столбцах.
Мне нужно получить набор данных с уникальным кодом ID - тоесть собрать весь список клиентов, но отобрать все остальные записи таким образом чтобы при пустом поле Fisc в одной из записей клиента в набор должна попасть только та, которая содержит в поле FISC хоть какое-то значение. Если обе записи клиента по данному полю окажутся пустыми - то в набор должна попасть любая из этих 2 записей со всеми остальными полями.
ВРоде так...
в Фоксе я бы сделал просто:
SELECT ID, MAX(Fisc) AS Fisc, last_name, first_name, Address, city,Ended FROM SQLRESULT gROUP BY Id
Но для SQL Server это не подойтет такай группировка так как эти поля также разные для отдного и того клиента. Конечно есть исключения - но это явно не тот случай

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT grp.id, grp.fisc, lstn.Last_name, fstn.First_name 
FROM (select id, MAX(fisc) AS IDNO FROM Clients group by Id) GRP 
LEFT JOIN (SELECT Id, MAX(last_name) AS Last_Name FROM CLIENTS  group by Id) lstn
ON grp.Id = lstn. id
LEFT JOIN (SELECT Id, MAX(First_name) AS First_Name FROM CLIENTS  group by Id) fstn
ON grp.ID = fstn.ID
.....
и так далее перечисляя все необходимые поля - это полное извращение, и работает это очень долго.
.........
ORDER BY grp.ID

Доложно же быть нормальное простое решение?!!!! Народ?
...
Рейтинг: 0 / 0
Запрос для MS SQL
    #37094263
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valeriiв Фоксе я бы сделал просто:
SELECT ID, MAX(Fisc) AS Fisc, last_name, first_name, Address, city,Ended FROM SQLRESULT gROUP BY Id
Подобный запрос означает случайное значение полей last_name, first_name, Address, city,Ended. Точнее, они будут иметь значение произвольной записи с одним и тем же ID. Могут как относится к записи с пустым значением Fisc, так и к записи с заполненным значением Fisc. Не угадаешь к какой.

Если бы не было дублей с пустым значением поля Fisc, то задача свелась бы к стандартной задаче поиска записи с максимальным значением некоего поля (Fisc). Соответственно, и решение стандартное

Код: plaintext
1.
2.
3.
4.
5.
SELECT tab1.*
FROM SQLRESULT tab1  
WHERE NOT EXISTS(SELECT 'x' FROM SQLRESULT tab2
		WHERE tab1.ID = tab2.ID 
			AND tab1.Fisc < tab2.Fisc)

Однако в случае двух записей по одному ID с пустым значением поля Fisc получим обе эти записи в данной выборке. Нужен дополнительный признак, чтобы как-то однозначно отличить одну запись от другой в случае, если равны значение полей ID и Fisc. В данном случае можно использовать комбинацию всех остальных полей. А на случай совсем одинаковых записей по всем полям использовать опцию DISTINCT

Получается как-то так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT DISTINCT tab1.*
FROM SQLRESULT tab1  
WHERE NOT EXISTS(SELECT 'x' FROM SQLRESULT tab2
		WHERE tab1.ID = tab2.ID 
			AND tab1.Fisc < tab2.Fisc)

AND NOT EXISTS(SELECT 'x' FROM SQLRESULT tab2
		WHERE tab1.ID = tab2.ID 
			AND tab1.Fisc = tab2.Fisc
			AND tab1.ast_name + tab1.first_name + tab1.Address + tab1.city + tab1.Ended 
			< tab2.ast_name + tab2.first_name + tab2.Address + tab2.city + tab2.Ended)


Правда, опять же тут надо учитывать типы полей. Если VarChar, то приводить к одной длине. Если не символьные, то конвертировать в Character. Ну, и такое сравнение невозможно для полей не определенной длины
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запрос для MS SQL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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