Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Запрос на дублирование записей  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
Подскажите, может есть возможность при помощи формул и/или функций добавить в запрос условие, чтобы отбирались только строки с дублирующимися значениями (суммой)
Имеется таблица:

Кодid_ЦПДатаКарта1Карта2Карта3
1255000501-01-20141002000
1265000601-01-20140500
1275000601-01-20140500
1285000601-01-201450212060


Строки с кодами 126 и 127 ошибочно добавлены оператиром дважды. За один день может быть несколько записей, но с разными значениями. Все значения - исключительно числовые. Думал, может как-то при помощи среднего значения пощитать..

Сам запрос:

use msdb
declare @date1 date = GETDATE()-3 

declare @t table (ЦП Nvarchar(100))
insert into @t (ЦП)

select [id_ЦП] as 'ЦП'  from [Access_BD]...[Платежи_АС] where [Дата]=@date1 group by [id_ЦП] having count ([Код]) >1
2 дек 14, 12:38    [16936572]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на дублирование записей  [new]
Glory
Member

Откуда:
Сообщений: 104760
2viper2viper
Строки с кодами 126 и 127 ошибочно добавлены оператиром дважды

Из чего следует, что именно эти записи ошибочные ?
Почему не 125 и 127 ?
2 дек 14, 12:40    [16936586]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на дублирование записей  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
Glory
2viper2viper
Строки с кодами 126 и 127 ошибочно добавлены оператиром дважды

Из чего следует, что именно эти записи ошибочные ?
Почему не 125 и 127 ?


потому что только по 126 и 127 указаны одиннаковые значения. такой результат может быть только в следствие ошибочного двойного внесения данных. В день двух одиннаковых строк со значением быть не может
2 дек 14, 12:44    [16936630]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на дублирование записей  [new]
Добрый Э - Эх
Guest
2viper2viper,

почитай про GROUP BY + HAVING
2 дек 14, 12:45    [16936637]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на дублирование записей  [new]
Добрый Э - Эх
Guest
далее можешь переключится на [NOT] EXISTS-подзапросы.
И на последок освоить LEFT JOIN + WHERE
2 дек 14, 12:46    [16936653]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на дублирование записей  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
2viper2viper
Glory
пропущено...

Из чего следует, что именно эти записи ошибочные ?
Почему не 125 и 127 ?


потому что только по 126 и 127 указаны одиннаковые значения. такой результат может быть только в следствие ошибочного двойного внесения данных. В день двух одиннаковых строк со значением быть не может
Но у Вас выбирается и 128, хотя значения там другие.
Вы бы на расском языке объяснили, что есть и что должно быть.
Перечитайте свой текст. Вы что-нибудь поняли? Например, что это за "значения" такие? В id_ЦП?
2 дек 14, 12:48    [16936674]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на дублирование записей  [new]
Добрый Э - Эх
Guest
2viper2viper
Сам запрос:

use msdb
declare @date1 date = GETDATE()-3 

declare @t table (ЦП Nvarchar(100))
insert into @t (ЦП)

select [id_ЦП] as 'ЦП'  from [Access_BD]...[Платежи_АС] where [Дата]=@date1 group by [id_ЦП] having count ([Код]) >1
Как минимум в группировке не хватает полей, по которым "считается уникальность" - Карта1, Карта2, Карта3
И при таком подходе без самообъединения результата группировки и исходной таблицы - ничего не выйдет
2 дек 14, 12:57    [16936750]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на дублирование записей  [new]
Glory
Member

Откуда:
Сообщений: 104760
select distinct id_ЦП,Дата,Карта1,Карта2,Карта3 from mytable
2 дек 14, 12:58    [16936758]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на дублирование записей  [new]
aleks2
Guest
select t.*  
  from [Access_BD]...[Платежи_АС] as t
       right outer join
       (select  id_ЦП, Дата, Карта1, Карта2, Карта3 from [Access_BD]...[Платежи_АС]  where  [Дата]=@date1 group by  id_ЦП, Дата, Карта1, Карта2, Карта3 having count(*) >1 ) x
       on t.id_ЦП = x.id_ЦП and t.Дата = x.Дата and t.Карта1 = x.Карта1 and t.Карта2 =x.Карта2 and t.Карта3 = x.Карта3
2 дек 14, 13:07    [16936854]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на дублирование записей  [new]
JeStone
Member

Откуда:
Сообщений: 248
2viper2viper
Строки с кодами 126 и 127 ошибочно добавлены оператиром дважды.
[/src]

А как вы определяете, что они действительно добавлены оператором ошибочно?
2 дек 14, 13:46    [16937199]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на дублирование записей  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
iap
2viper2viper
пропущено...


потому что только по 126 и 127 указаны одиннаковые значения. такой результат может быть только в следствие ошибочного двойного внесения данных. В день двух одиннаковых строк со значением быть не может
Но у Вас выбирается и 128, хотя значения там другие.
Вы бы на расском языке объяснили, что есть и что должно быть.
Перечитайте свой текст. Вы что-нибудь поняли? Например, что это за "значения" такие? В id_ЦП?


в первом посте указанна исходная таблица, в которой строки с кодом 126 и 127 внесены ошибочно дважды (по специфике данных в таблице за один день по каждому подразделению (поле "id_ЦП") не должно быть строк с одиннаковыми наборами полей:
карта1,карта2...
Тоесть, строка со значениями "дата, код подразделения, карта1,карта2..." всегда должна бить уникальна.
А в результате нужно получить список подразделений (id_ЦП), по которым возникла ошибка на определенную дату

По примеру с данными в таблицке первого поста нужно получить
id_ЦПДата
5000601-01-2014
3 дек 14, 13:27    [16943211]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на дублирование записей  [new]
Glory
Member

Откуда:
Сообщений: 104760
2viper2viper
По примеру с данными в таблицке первого поста нужно получить
id_ЦПДата
5000601-01-2014

select distinct id_ЦП,Дата from mytable where [Дата]=@date1
3 дек 14, 13:32    [16943259]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на дублирование записей  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
WITH CTE AS(SELECT *,С=COUNT(*)OVER(PARTITION BY id_ЦП,Дата,Карта1,Карта2,Карта3)  FROM [Платежи_АС])
SELECT * FROM CTE WHERE C>1;
3 дек 14, 13:44    [16943332]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на дублирование записей  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
iap
WITH CTE AS(SELECT *,С=COUNT(*)OVER(PARTITION BY id_ЦП,Дата,Карта1,Карта2,Карта3)  FROM [Платежи_АС])
SELECT * FROM CTE WHERE C>1;


То что нужно) внутренний запрос выполняется и результирует желаемые данные. но при добавлении условия
 WHERE C>1

повляется ошибка
Недопустимое имя столбца "C".
как можно подправить?


как-то даже не подумал в направлении PARTITION BY.
Спасибо iap
3 дек 14, 14:33    [16943683]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на дублирование записей  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
2viper2viper
едопустимое имя столбца "C".

iap пошутил и набрал ваше С в разных расскладках:)
3 дек 14, 14:36    [16943712]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на дублирование записей  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Maxx
2viper2viper
едопустимое имя столбца "C".

iap пошутил и набрал ваше С в разных расскладках:)
Язык разный получился?
Это PuntoSwitcher так шутит
3 дек 14, 17:52    [16945281]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на дублирование записей  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
iap
Maxx
пропущено...

iap пошутил и набрал ваше С в разных расскладках:)
Язык разный получился?
Это PuntoSwitcher так шутит


Таки да) Подправил
iap, Большое спасибо
4 дек 14, 15:16    [16950179]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на дублирование записей  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
Вопрос второстепенной важности, но просто уже интересно

При запросе
declare @t table (ЦП Nvarchar(100),Дата date);
WITH CQ AS(SELECT *,c=COUNT(*)OVER(PARTITION BY 
	   [id_ЦП]
      ,[Дата]
      ,[Вид 1]
      ,[Вид 2]
)  FROM [Access_BD]...[Платежи] where [Дата] >= @date)

insert into @t (ЦП,Дата)
SELECT  [id_ЦП],convert(nvarchar(10),[Дата], 104)  FROM CQ WHERE c>1 ;

select * from @t

значение поля "Дата" выгружается в SSMS в формате ГГГГ-ММ-ДД. Функция convert не результирует по какой-то причине желаемый формат даты ДД.ММ.ГГГГ
6 дек 14, 00:49    [16959269]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на дублирование записей  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
В табличной переменной @t Дата - типа DATE.
О каком вообще "формате" речь?
При чём здесь "строковое представление даты"?
Это может относиться только к SELECTу.
6 дек 14, 09:28    [16959756]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на дублирование записей  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
iap
В табличной переменной @t Дата - типа DATE.
О каком вообще "формате" речь?
При чём здесь "строковое представление даты"?
Это может относиться только к SELECTу.


может не правильно выразился
при таком запросе поле дата в ssms отборажается в виде 2014-01-01
для удобного восприятия хотелось бы, чтобы значение даты в этом поле было в виде 01.01.2014
в других запросах к этой же бд access результат даты в виде 01.01.2014
может это через использование cte?
6 дек 14, 10:39    [16959818]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на дублирование записей  [new]
правильный проходящий.
Guest
2viper2viper,

отображением, в том числе и дат, занимается клиент. При чем тут сервер и уж тем более cte?
6 дек 14, 11:08    [16959870]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на дублирование записей  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
правильный проходящий.
2viper2viper,

отображением, в том числе и дат, занимается клиент. При чем тут сервер и уж тем более cte?


мне в ssms удобно просмотреть результат запроса
6 дек 14, 11:29    [16959907]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на дублирование записей  [new]
правильный проходящий.
Guest
2viper2viper
правильный проходящий.
2viper2viper,

отображением, в том числе и дат, занимается клиент. При чем тут сервер и уж тем более cte?


мне в ssms удобно просмотреть результат запроса
Тогда какого лешего пишете
2viper2viper,
в других запросах к этой же бд access результат даты в виде 01.01.2014
?
ssms - тоже клиент и показывает даты в соответствии с настройками винды.
Но если уж очень приперло, то результате запроса можно из даты функций convert() получить строку, которая, естественно, будет везде отображаться одинаково.
6 дек 14, 11:39    [16959930]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на дублирование записей  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
здесь пременено не правильно?
6 дек 14, 11:46    [16959953]     Ответить | Цитировать Сообщить модератору
 Re: Запрос на дублирование записей  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
2viper2viper
здесь пременено не правильно?
Там вставка в поле типа DATE (а не строковое).
А в последнем SELECTе никакого CONVERTа нет.
6 дек 14, 12:03    [16959990]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить