抱歉标题不好。我想不出更好的方式来描述我的问题。
我有下表:
Category | A | B
A | 1 | 2
A | 2 | 2
B | 3 | 4
B | 4 | 3
A类(第1行和第2行)的值是错误的,因为应该镜像A列和B列。对于B类(第3和第4行),值是正确的。
这是正确的表格应该是这样的:
Category | A | B
A | 1 | 2
A | 2 | 1
B | 3 | 4
B | 4 | 3
但是,我手边有第一张桌子。对于此表,我想输出一条错误消息,指出值1和2不正确mirrored
。
要创建此输出消息,请使用以下查询
SELECT 'The values of category ' + category + ' are not correctly mirrored'
FROM table t1
INNER JOIN table t2 ON t1.category=t2.category AND t1.A!=t2.A AND (t1.A!=t2.B OR t1.B!=t2.A)
GROUP BY t1.category
此查询有效。但是,我想用A和B各自的值来增强错误消息。例如:
SELECT 'The values ' + a + ' and ' + b + ' of category ' + category + ' are not correctly mirrored'
FROM table t1
INNER JOIN table t2 ON t1.category=t2.category AND t1.A!=t2.A AND (t1.A!=t2.B OR t1.B!=t2.A)
GROUP BY t1.category
但是,显然,我得到以下错误:
列'a'在选择列表中无效,因为它未包含在内 在聚合函数或GROUP BY子句中。
列'b'在选择列表中无效,因为它不包含在任何一个中 聚合函数或GROUP BY子句。
如何达到预期效果?
答案 0 :(得分:1)
尝试这样的事情
SELECT Category,
CASE
WHEN Min(A) = Min(B)
AND Max(A) = Max(B) THEN 'The values of category ' + category + ' are correctly mirrored'
ELSE 'The values of category ' + category + ' are not correctly mirrored'
END
FROM yourtable
GROUP BY Category
答案 1 :(得分:0)
您可以按条件取出组并选择前1行,以便显示a和b的值。
SELECT TOP 1
'The values ' + CONVERT(VARCHAR(8), t1.a) + ' and ' + CONVERT(VARCHAR(8), t1.b) + ' of category ' + t1.category + ' are not correctly mirrored' ErrMessage
FROM [table] t1
INNER JOIN [table] t2 ON t1.category=t2.category AND t1.A!=t2.A AND (t1.A!=t2.B OR t1.B!=t2.A)
ORDER BY
t1.category
,t1.a
,t1.b
或者您可以使用ROW_NUMBER计算结果并制作PARTITION BY类别,如果您期望多个具有类似错误的类别。
SELECT
A.ErrMessage
FROM
(
SELECT
'The values ' + CONVERT(VARCHAR(8), t1.a) + ' and ' + CONVERT(VARCHAR(8), t1.b) + ' of category ' + t1.category + ' are not correctly mirrored' ErrMessage
,ROW_NUMBER()OVER(PARTITION BY t1.category ORDER BY t1.a, t1.B) Position
FROM [table] t1
INNER JOIN [table] t2 ON t1.category=t2.category AND t1.A!=t2.A AND (t1.A!=t2.B OR t1.B!=t2.A)
) A
WHERE A.Position = 1
最后一个例如这样的表:
Category A B
-------- ----------- -----------
A 1 2
A 2 2
B 3 4
B 4 3
C 5 6
C 6 6
将返回错误的两个类别:
ErrMessage
-------------------------------------------------------------------------
The values 1 and 2 of category A are not correctly mirrored
The values 5 and 6 of category C are not correctly mirrored