SQL:Group By with Case语句用于多个字段

SQL:Group By with Case语句用于多个字段,sql,group-by,case,Sql,Group By,Case,我试图用CASE语句编写一个GROUPBY子句,以便根据查询中参数的值有条件地对BY进行分组。这是我正在使用的查询(大大缩短了),我一直得到“RVPname在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。DVPname无效,AEname无效 SELECT DVPname, RVPname, AEname, Dealer, Product, Distribution, CASE WHEN @LEVEL = 'DVP' THEN DVPname WHEN @LEVEL = 'R

我试图用CASE语句编写一个GROUPBY子句,以便根据查询中参数的值有条件地对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'我想按RVPname分组时,LEVEL='RVP'我想按AEname分组……有意义吗?

你需要选择所有不在
GROUP BY
子句中的列,并使用聚合函数,例如
AVG()
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;

如果您只需要有条件的
分组方式
,那么我建议使用子查询:

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;

这将返回列的最小值。

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

下面的代码删除了group by语句中仅有条件的所有列(DVPname、RVPname、AEname、DELER)(只要它们不在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 

我知道两种方法:GROUPBY(Case语句1,Case语句2)和subquery。我确定每个方法将占用多少行,然后在此基础上进行处理

例如(分组人):

例如(子查询)


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

该“此处的其他代码”部分是否包含任何聚合,如sum()、min(),等等?如果是这样,您必须按select子句中的所有内容进行分组。如果不是,group by子句的用途是什么?
group by
case不同于
select
case;它们应该相同才能起作用。其他代码仅包括计算字段。同样,如果您没有aggr,group by子句的用途是什么egates?所以您将有
按空分组,名称
按id分组,空
,对吗?它将是按
按[id]分组
按[name]分组
。此外,您可以将所有这些组合成
按DVPname分组,RVPname,AEname,经销商,产品,分销,案例,当@SortColumn='0'时[id]END,CASE当@SortColumn='1'时,则[name]END;
否。您没有使用
ELSE
,而是列出了两个
CASE
语句,用逗号分隔。这将解决在select列表中RVPname无效的问题,因为它既不包含在聚合函数中,也不包含在GROUP by子句中
    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)