Запрос SQL для сценария ниже для нескольких строк - PullRequest
0 голосов
/ 24 сентября 2019

Нужен ответ согласно ожидаемому столбцу результатов в прикрепленном изображенииФильтрация строк требуется в нескольких строках

enter image description here

Правило (x.attr2 = '1' AND x.attr3 = '1') AND(x.attr2 = '' AND x.attr3 = '2') тогда его ожидаемое значение столбца будет истинным, но все остальные условия его ложным

его MS SQL

Key Atr2    Atr3    expected result
111  1       1      TRUE
111  2       2  
112  1       4      FALSE
113  1       4      FALSE
113  2       2  
114  1       1      FALSE

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

Проверьте приведенный ниже скрипт -

IF OBJECT_ID('[Sample]') IS NOT NULL
    DROP TABLE [Sample]

CREATE TABLE [Sample]
(
[Key] INT NOT NULL,
Attr1 INT NOT NULL,
Attr2 INT NOT NULL,
Attr3 INT NOT NULL
)
GO

INSERT INTO [Sample] ([Key],Attr1,Attr2,Attr3)
VALUES (111,62,1,1),
(111,62,2,2),
(112,62,1,4),
(113,62,1,4),
(113,62,2,2),
(114,62,1,1)

--EXPECTED_RESULT:
SELECT S.*,CASE WHEN T.[KEY] IS NOT NULL THEN 'TRUE' ELSE 'FALSE' END AS Expected_Result 
FROM [Sample] S LEFT JOIN
( 
SELECT T.[KEY] FROM
(
SELECT x.*,
ROW_NUMBER() OVER( PARTITION BY x.[KEY],x.attr1 ORDER BY x.attr2,x.attr3) AS r_no
--,CASE WHEN (x.attr2 = 1 AND x.attr3 = 1) OR (x.attr2 = 2 AND x.attr3 = 2) 
--then 'TRUE' else 'FALSE' end as expected_result
FROM [Sample] x WHERE x.attr2=x.attr3
) T WHERE T.r_no>1
) T ON S.[KEY]=T.[KEY]
0 голосов
/ 24 сентября 2019

Этот запрос:

select key from tablename
group by key
having sum(case when atr2 = '1' and atr3 = '1' then 1 else 0 end) > 0
   and sum(case when atr2 = '2' and atr3 = '2' then 1 else 0 end) > 0
   and count(*) = 2

использует условное агрегирование, чтобы найти ключи, для которых результат должен быть true.Так что присоедините его к столу так:

select t.*, 
  case when g.[key] is null then 'FALSE' else 'TRUE' end result
from tablename t left join (
  select [key] from tablename
  group by [key]
  having sum(case when atr2 = '1' and atr3 = '1' then 1 else 0 end) > 0
     and sum(case when atr2 = '2' and atr3 = '2' then 1 else 0 end) > 0
     and count(*) = 2
) g on g.[key] = t.[key]

См. демо .Результаты:

> Key | Atr2 | Atr3 | result
> --: | ---: | ---: | :-----
> 111 |    1 |    1 | TRUE  
> 111 |    2 |    2 | TRUE  
> 112 |    1 |    4 | FALSE 
> 113 |    1 |    4 | FALSE 
> 113 |    2 |    2 | FALSE 
> 114 |    1 |    1 | FALSE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...