#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
которое проверяет, изменилось ли какое-либо из других полей