4

我正在尝试使用 CASE 语句编写 GROUP BY 子句,以便可以根据查询中的参数值有条件地进行 GROUP BY。这是我正在使用的查询(显着缩短),我不断收到“RVPname 在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中。并且 DVPname 无效并且 AEname 无效。

SELECT
DVPname, RVPname, AEname, Dealer, Product, Distribution, 

CASE WHEN @LEVEL = 'DVP' THEN DVPname
WHEN @LEVEL = 'RVP' THEN RVPname
WHEN @LEVEL = 'AE' THEN AEname
END AS NAME

..........other code here.....

GROUP BY Product, Distribution,
CASE WHEN @LEVEL = 'RVP' THEN AEname WHEN @LEVEL = 'DVP' THEN RVPname WHEN @LEVEL= 'AE' THEN Dealer END

- 有谁知道如何做我想要完成的事情。当 LEVEL='DVP' 我想 GROUP BY RVPname 时,当 LEVEL='RVP' 我想 GROUP BY AEname....有意义吗?

4

4 回答 4

8

没有聚合的分组查询(例如您的查询)仅对删除重复项有用。因此,您的选择是为 select 子句中不在 group by 中的列添加聚合,或者使用查询删除重复项。

以下代码删除了仅在 group by 语句中有条件的所有列(DVPname、RVPname、AEname、Dealer)(只要它们不在 group by 中但在 select 中,它将遇到错误)。它还将名称添加到 group by 以便它可以在 select 子句中。

SELECT
Product, Distribution,
CASE 
    WHEN @LEVEL = 'DVP' THEN DVPname
    WHEN @LEVEL = 'RVP' THEN RVPname
    WHEN @LEVEL = 'AE' THEN AEname
END AS NAME,
CASE 
     WHEN @LEVEL = 'RVP' THEN AEname 
     WHEN @LEVEL = 'DVP' THEN DVPname 
     WHEN @LEVEL= 'AE' THEN Dealer 
END 

..........other code here.....

GROUP BY Product, Distribution, 
CASE 
    WHEN @LEVEL = 'DVP' THEN DVPname
    WHEN @LEVEL = 'RVP' THEN RVPname
    WHEN @LEVEL = 'AE' THEN AEname
END,
CASE 
     WHEN @LEVEL = 'RVP' THEN AEname 
     WHEN @LEVEL = 'DVP' THEN DVPname 
     WHEN @LEVEL= 'AE' THEN Dealer 
END 
于 2013-05-17T20:28:26.740 回答
1

GROUP BY您将需要使用聚合函数(例如AVG()or )选择不在子句中的所有列SUM()。否则,数据库不知道如何处理与分组记录一起返回的多个条目。

例如,您的 select 语句应该以这样的开头:

SELECT
SUM(DVPname), AVG(RVPname),

如果它们是文本条目并且您知道它们都是相同的,您也可以将它们添加到GROUP BY子句中。

GROUP BY DVPname, RVPname, AEname, Dealer, Product, Distribution

此外,以下是您的分组案例陈述的良好格式:

GROUP BY
CASE WHEN @SortColumn = '0'
THEN [id] END,
CASE WHEN @SortColumn = '1'
THEN [name] END;
于 2013-05-17T19:37:28.393 回答
0

如果您只想要条件group by,那么我建议使用子查询:

select name, . ..
from (select (CASE WHEN @LEVEL = 'DVP' THEN DVPname
                   WHEN @LEVEL = 'RVP' THEN RVPname
                   WHEN @LEVEL = 'AE' THEN AEname
              END
             ) AS NAME, t.*
      from t
     ) t
group by name;

但是,您会丢失所需的所有其他字段。在大多数数据库中,您不能在 中包含列,select除非它们被聚合或包含在group by子句中。这是从列中获取任意值的替代方法:

SELECT min(DVPname), min(RVPname), min(AEname), min(Dealer), min(Product),
       min(Distribution),
       . . .
from (select (CASE WHEN @LEVEL = 'DVP' THEN DVPname
                   WHEN @LEVEL = 'RVP' THEN RVPname
                   WHEN @LEVEL = 'AE' THEN AEname
              END
             ) AS NAME, t.*
      from t
     ) t
group by name;

这将返回列的最小值。

于 2013-05-17T20:03:38.907 回答
0

我知道两种方法:GROUP BY(案例语句 1,案例语句 2)和子查询。我确定每种方法将占用多少行,然后以此为基础进行我的流程。

前任。(通过...分组):

    SELECT
        CASE
            WHEN (situation A)
            THEN (result A)
            WHEN (situation B)
            THEN (result B)
        END column1,
        CASE
            WHEN (situation C)
            THEN (result C)
            WHEN (situation D)
            THEN (result D)
        END column2,
        SUM(AMOUNT) as TotalAMOUNT
    FROM aTable
    GROUP BY 
        CASE
            WHEN (situation A)
            THEN (result A)
            WHEN (situation B)
            THEN (result B)
        END,
        CASE
            WHEN (situation C)
            THEN (result C)
            WHEN (situation D)
            THEN (result D)
        END

前任。(子查询)

    SELECT
        Column1,
        Column2,
        SUM(AMOUNT) as TotalAMOUNT
    FROM
        (
        SELECT
            CASE
                WHEN (situation A)
                THEN (result A)
                WHEN (situation B)
                THEN (result B)
            END column1,
            CASE
                WHEN (situation C)
                THEN (result C)
                WHEN (situation D)
                THEN (result D)
            END column2,
            AMOUNT
        FROM aTable
        )CaseTable
    GROUP BY Column1, Column2
    ORDER BY Column1 asc, SUM(AMOUNT) 

我认为要记住的重要一点是,除了分组内容之外,您不能包含其他详细信息。在以上两个示例中,您的查询结果按您指定的变量分组。您还可以根据变量添加某种类型的状态,然后将其按附加列汇总,并选择不在汇总中显示最后一列。

于 2016-09-01T19:54:47.580 回答