:: Visual Foxpro, Foxpro for DOS
SQL в Visual Fox v9
Leffurt
Автор

Сообщений: 33
Дата регистрации: 15.06.2015
Здравствуйте.
Не могу сообразить как составить запрос, чтобы на выходе получилось как на картинке. Суть: есть таблица в которой два столбца связаны жёстко, то есть, например не может быть камень быть и жидкостью и твёрдым телом (это так, чтобы понятнее было, на самом деле там совсем другая тема и не так однозначно само сопоставление). Вот надо выявить ошибки, то есть вывести на экран только те записи, где имеется несколько разных состояний у одного объекта. При малом количестве данных достаточно вывести на экран SELECT DISTINCT object, st_of_agg FROM users_po, но данных намного больше и хотелось бы откинуть те записи, где объект имеет всего одно состояние. Подсчёт количества записей в группе не помогает, так как правильных записей может быть несколько, а различаться записи могут по другим параметрам (столбцам). Опыта по составлению SQL-запросов практически нет, ранее требовались только простенькие запросы.
Ratings: 0 negative/0 positive
Re: SQL в Visual Fox v9
boba

Сообщений: 6269
Откуда: Медвежьи озера-
Дата регистрации: 26.03.2001
что-то типа having count(*)>1 по группе полей,
где не должно быть дублей
Если более сложное сравнение,
всегда в запросе можно открыть таблицу дважды,
и сравнивать ее саму с собой
from tablename a, tablename b
Ratings: 0 negative/0 positive
Re: SQL в Visual Fox v9
Leffurt
Автор

Сообщений: 33
Дата регистрации: 15.06.2015
Вот у меня-то и не получается составить правильно запрос. По количеству в группе больше 1 записи никак не получиться, так как в любой группе может быть больше 1 записи. Тут как-то надо сравнить количество записей в группе только по одному полю поле1 и количество в группе поле1+поле2 должно совпадать, вывести нужно только те группы где это количество не совпадает.
Ratings: 0 negative/0 positive
Re: SQL в Visual Fox v9
PaulWist

Сообщений: 14621
Дата регистрации: 01.04.2004
1. Написать скрипты таблиц.

2. Написать скрипты заполнения таблиц данными.

3. Написать, какой нужен результат.

PS всем лень это делать самостоятельно, помогите себе сами и участникам форума.




------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/3 positive
Re: SQL в Visual Fox v9
Leffurt
Автор

Сообщений: 33
Дата регистрации: 15.06.2015
На входе, например, таблица in_dbf.dbf, а на выходе должна получиться out_dbf.dbf
Ratings: 0 negative/0 positive
Re: SQL в Visual Fox v9
Владимир Максимов

Сообщений: 14100
Откуда: Москва
Дата регистрации: 02.09.2000
Есть фича для опции DISTINCT внутри агрегирующей функции COUNT()

SELECT ;
object, ;
count(DISTINCT st_of_agg) as cnt ;
FROM users_po ;
group by object ;
having count(DISTINCT st_of_agg) > 1

В таком синтаксисе получите список объектов, у которых есть больше одного уникального состояния. Записи с одинаковым состоянием считаются как 1. Дальше отдельные запросы по этим объектам и смотрите, в чем там дело

Но, в общем случае, если количество записей очень велико, то для корректного анализа, нужно еще где-то иметь список допустимых состояний объектов. Тогда можно будет сделать сравнение списков и отобразить только те записи, которые имеют недопустимые комбинации.
Ratings: 0 negative/0 positive
Re: SQL в Visual Fox v9
Leffurt
Автор

Сообщений: 33
Дата регистрации: 15.06.2015
Visual Foxpro v.9.0 ругается на первый DISTINCT. Пишет: SQL: DISTINCT is invalid.
У меня получился требуемый результат, но хотелось бы освоить это при помощи одной команды SELECT, а не трёх:
SELECT object, COUNT(*) as cnt_ob ;
FROM in_dbf;
GROUP BY object INTO TABLE dbf1
SELECT object, st_of_agg, COUNT(*) as cnt_ob ;
FROM in_dbf;
GROUP BY object,st_of_agg INTO TABLE dbf2
SELECT dbf2.object, dbf2.st_of_agg FROM dbf2;
INNER JOIN dbf1 ON dbf1.object=dbf2.object;
WHERE dbf1.cnt_ob#dbf2.cnt_ob;
INTO TABLE itog
тут я использую in_dbf, так как до этого в приложенном файле было указано это название вместо user_po



Исправлено 2 раз(а). Последнее : Leffurt, 09.04.21 16:13
Ratings: 0 negative/0 positive
Re: SQL в Visual Fox v9
PaulWist

Сообщений: 14621
Дата регистрации: 01.04.2004
Примерно так.

SELECT dbf2.object, dbf2.st_of_agg FROM ;
(;
SELECT object, st_of_agg, COUNT(*) as cnt_ob ;
FROM in_dbf;
GROUP BY object,st_of_agg;
) dbf2;
INNER JOIN ;
(;
SELECT object, COUNT(*) as cnt_ob ;
FROM in_dbf;
GROUP BY object;
) dbf1 ON dbf1.object=dbf2.object;
and dbf1.cnt_ob#dbf2.cnt_ob


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)




Исправлено 1 раз(а). Последнее : PaulWist, 09.04.21 16:51
Ratings: 0 negative/2 positive
Re: SQL в Visual Fox v9
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
SELECT DISTINCT object, st_of_agg ;
FROM in_dbf ;
WHERE object IN ;
(SELECT object ;
FROM in_dbf ;
GROUP BY object ;
HAVING COUNT(DISTINCT st_of_agg) > 1) ;
INTO CURSOR invalidData


------------------
WBR, Igor
Ratings: 0 negative/2 positive
Re: SQL в Visual Fox v9
Leffurt
Автор

Сообщений: 33
Дата регистрации: 15.06.2015
Спасибо! Всё получилось!
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 27 (Гостей: 27)

© 2000-2024 Fox Club 
Яндекс.Метрика