¿Cómo consultar filas que tienen diferentes valores para una columna?
Para una tabla OrderLine como esta:
Orden | Línea | col3 | col4 |
---|---|---|---|
1 | 1 | X | X |
1 | 2 | X | Y |
2 | 1 | Y | X |
2 | 2 | Y | X |
3 | 1 | X | Y |
3 | 2 | Y | Y |
4 | 1 | X | Y |
4 | 2 | X | Y |
Col4 puede ser X o Y, no ambos. El orden 1 en esta tabla viola la regla. ¿Cómo encuentro todos los pedidos que tienen valores diferentes en Col4 para el mismo pedido?
Mi idea inicial fue unirme a la tabla varias veces y luego usar una cláusula HAVING.
SELECT DISTINCT A.[Order], A.Line, A.Col3, A.Col4, A.Col4
FROM OrderLines A
INNER JOIN OrderLines B ON B.[Order]= A.[Order]
AND B.Line = A.Line
GROUP BY A.[Order], A.Line, A.Col3, A.Col4, A.Col4, B.[Order], B.Line, B.Col4
HAVING(A.Line <> B.Line AND A.Col4 <> B.Col4)
ORDER BY A.[Order] ASC, A.Line ASC
Aceptado
Encuentre todos los pedidos que tienen diferentes valores en Col4 para el mismo pedido
--Create OrderLine table
CREATE TABLE OrderLine
(
[Order] VARCHAR(512),
Line VARCHAR(512),
col3 VARCHAR(512),
col4 VARCHAR(512)
);
--Populate OrderLine table
INSERT INTO OrderLine ([Order] , Line , col3 , col4) VALUES
('1 ', '1 ', 'X ', 'X'),
('1 ', '2 ', 'X ', 'Y'),
('2 ', '1 ', 'Y ', 'X'),
('2 ', '2 ', 'Y ', 'X'),
('3 ', '1 ', 'X ', 'Y'),
('3 ', '2 ', 'Y ', 'Y'),
('4 ', '1 ', 'X ', 'Y'),
('4 ', '2 ', 'X ', 'Y')
--Verify that the record were added correctly
SELECT * FROM OrderLine
--Select all order rows that have differing col4 values
SELECT * FROM OrderLine
WHERE [order] in
(
SELECT [order]
FROM OrderLine group by [order]
HAVING min(col4)<>max(col4)
)
Violín
Orden | Línea | col3 | col4 |
---|---|---|---|
1 | 1 | X | X |
1 | 2 | X | Y |