SQL GROUP BY,其列应包含镜像值

时间:2017-02-03 16:32:41

标签: sql-server group-by aggregate

抱歉标题不好。我想不出更好的方式来描述我的问题。

我有下表:

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子句。

如何达到预期效果?

2 个答案:

答案 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