Сравните две таблицы в одном столбце, которые не совпадают и дают альтернативные строки - sql
Мое требование, как показано ниже,
Мне нужно, чтобы данные сравнивались из двух идентичных таблиц, где дано имя версии и все остальные столбцы совпадают, кроме [Значение]. Требуется отображаться в чередующихся строках с "ДА" "Нет"
Мой запрос:
Select [Versions],[Profile],Value,[Step1],[Step2],[Step3],[Step4],[Step5],[Step6],[Step7],[UploadedBy]
from
(
SELECT a.[Versions],a.[Profile],a.[Value] ,a.[Step1],a.[Step2],a.[Step3],a.[Step4],a.[Step5],
a.[Step6],a.[Step7] ,a.[UploadedBy],a.[UploadedOn] FROM [CREP].[dbo].[T_CRI_RollenProfile_CurrentProfiles] as a
inner join [CREP].[dbo].[T_CRI_RollenProfile_MasterProfiles] as b
on
( a.[Profile]=b.[Profile] and a.[Step1]=b.[Step1] and a.[Step2]=b.[Step2] and a.[Step3]=b.[Step3] and
a.[Step4]=b.[Step4]and a.[Step5]=b.[Step5] and a.[Step6]=b.[Step6] and a.[Step7]=b.[Step7])
where a.Value<>b.Value and a.[Versions]='Current_20150318_v2'
union
SELECT a.[Versions],a.[Profile],a.[Value] ,a.[Step1],a.[Step2],a.[Step3],a.[Step4],
a.[Step5],a.[Step6],a.[Step7] ,a.[UploadedBy],a.[UploadedOn]
FROM [CREP].[dbo].[T_CRI_RollenProfile_MasterProfiles] as a
inner join [CREP].[dbo].[T_CRI_RollenProfile_CurrentProfiles] as b
on ( a.[Profile]=b.[Profile] and a.[Step1]=b.[Step1] and a.[Step2]=b.[Step2] and a.[Step3]=b.[Step3]
and a.[Step4]=b.[Step4]and a.[Step5]=b.[Step5] and a.[Step6]=b.[Step6] and a.[Step7]=b.[Step7])
where a.[Versions]='Master_20150318_v4' and a.Value<>b.Value) as data
group by [Profile],[Step1],[Step2],[Step3],[Step4],[Step5],[Step6],[Step7],[Versions],Value,[UploadedBy]"
Может ли кто-нибудь помочь.? Я не получаю требуемый вывод. Я не знаю, где я пропускаю.. на стыковках
Структура таблицы и условия
[dbo].[T_CRI_RollenProfile_CurrentProfiles] a.[Versions]='Current_20150318_v2'
[dbo].[T_CRI_RollenProfile_MasterProfiles] a.[Versions]='Master_20150318_v4'
a.[Profile]=b.[Profile] and a.[Step1]=b.[Step1] and a.[Step2]=b.[Step2] and
a.[Step3]=b.[Step3] and a.[Step4]=b.[Step4]and a.[Step5]=b.[Step5] and
a.[Step6]=b.[Step6] and a.[Step7]=b.[Step7])where a.[Versions]="[]" and a.Value<>b.Value
1 ответ
Трудно сказать без данных для изучения, но похоже, что это одно и то же. Просто один неопубликованный запрос, занятый, но простой.
SELECT a.Versions, a.Profile, a.Value, a.Step1, a.Step2, a.Step3, a.Step4, a.Step5,
a.Step6, a.Step7, a.UploadedBy
FROM CREP.dbo.T_CRI_RollenProfile_CurrentProfiles as a
join CREP.dbo.T_CRI_RollenProfile_MasterProfiles as b
on a.Profile = b.Profile
and a.Step1 = b.Step1
and a.Step2 = b.Step2
and a.Step3 = b.Step3
and IsNull( a.Step4, 'null' ) = IsNull( b.Step4, 'null' )
and IsNull( a.Step5, 'null' ) = IsNull( b.Step5, 'null' )
and IsNull( a.Step6, 0 ) = IsNull( b.Step6, 0 ) -- if step6 is a numeric field
and IsNull( a.Step7, 'null' ) = IsNull( b.Step7, 'null' )
where a.Value<>b.Value
and a.Versions in( 'Current_20150318_v2', 'Master_20150318_v4' )
order by Profile, Step1, Step2, Step3, Step4, Step5, Step6, Step7, UploadedBy, Value desc;
На вашем скриншоте Step3 показан дважды, один раз с данными и один раз без. Из двух показанных строк я должен был предположить, что если в полях отображались данные, они НЕ были равны NULL. Итак, предполагая, что вы хотите, чтобы значение NULL в одном и том же поле из обеих таблиц считалось одним и тем же значением, вы должны использовать IsNull
, Для второго параметра используйте значение, которое не может быть найдено в качестве фактического значения в поле. И это должен быть тот же тип, что и поле. Таким образом, если, как показано, Step6 является числовым полем, второй параметр также должен быть числовым. Я показываю ноль, но если это возможное фактическое значение, выберите другое.
Что я не понимаю, так это группировка. Можно ли иметь более одной строки в таблице с одинаковыми данными во всех полях, и вы хотите объединить их в одну выходную строку? Я предполагаю, что нет, но если так, то проще просто добавить DISTINCT
после SELECT
,
Вы хотите order by
все поля, кроме Versions
, Value
поле должно быть последним и нисходящим - "Да" перед "Нет".