sql отслеживает измененные значения

#sql #sql-server #tsql

#sql #sql-сервер #tsql

Вопрос:

Я пытаюсь выяснить, какие значения пользователь изменяет чаще всего. У меня есть пользовательская таблица, подобная этой:

введите описание изображения здесь

Это пользовательская таблица, записи в которой не изменяются. Если пользователь что-то меняет, создается новая запись для отслеживания изменений пользователей.

Теперь я хочу получить что-то вроде этого:

введите описание изображения здесь

Я хочу, чтобы имена столбцов (электронная почта, телефон и т.д.) Были значениями, чтобы я мог сортировать.

Есть ли у кого-нибудь идеи, как я мог бы это сделать, пожалуйста?

Редактировать: я использую SSMS и T-SQL

Комментарии:

1. У меня была бы таблица users с одной строкой на пользователя, хранящая текущие значения. Тогда у меня был бы триггер для регистрации изменений (по одной строке на изменение, хранящий как старые, так и новые значения.)

2. @jarlh Мне не разрешено вносить изменения в базу данных.

3. @LucienRyter: SSMS не является «базой данных» или «СУБД». Это приложение, которое может подключаться к базе данных SQL Server для выполнения инструкций SQL, и это не имеет отношения к вопросу

4. @LucienRyter вы не можете обнаружить изменения данных без включения отслеживания изменений , добавления триггеров в таблицу или использования таблицы с системной версией.

5. Отслеживание изменений очень легкое, работает со всеми версиями и изданиями и может возвращать либо измененные идентификаторы, либо все строки с момента последнего изменения. Это также прозрачно для таблиц и приложений. Триггеры требуют добавления дополнительных таблиц и т.д. Для таблиц с системными версиями требуется SQL Server 2016 или более поздней версии

Ответ №1:

Это выглядит ужасно, но работает:

 select * into #q1 from (SELECT Row_number()OVER(ORDER BY i.CreationDate) rn, i.Email, i.Phone, i.Address, i.Phone, i.NumberOfKids
         FROM   user i) as t

SELECT Sum(CASE WHEN a.Email= b.Email THEN 0 ELSE 1 END) as Amount, 'Email' as ColumnName
FROM   #q1 a
       JOIN #q1 b
         ON a.UserID= b.UserID
UNION ALL
SELECT Sum(CASE WHEN a.Address= b.Address THEN 0 ELSE 1 END) as Amount, 'Address' as ColumnName
FROM   #q1 a
       JOIN #q1 b
         ON a.UserID= b.UserID
UNION ALL
SELECT Sum(CASE WHEN a.Phone= b.Phone THEN 0 ELSE 1 END) as Amount, 'Phone' as ColumnName
FROM   #q1 a
       JOIN #q1 b
         ON a.UserID= b.UserID
UNION ALL
SELECT Sum(CASE WHEN a.NumberOfKids= b.NumberOfKids THEN 0 ELSE 1 END) as Amount, 'NumberOfKids' as ColumnName
FROM   #q1 a
       JOIN #q1 b
         ON a.UserID= b.UserID
order by Amount desc
drop table #q1
  

Комментарии:

1. Только в том случае, если фактический вопрос отличался от того, что вы задали. Вам вообще не нужно объединение, просто одно самостоятельное объединение, WHERE которое проверяет, изменилось ли какое-либо из других полей