对 select 语句中的行进行分组

Grouping rows from select statement

我有一个 SQL 查询,它给我的输出如下:

查询:

SELECT LineBaseOP.LineName, COUNT(CekimOzelligiBasedOP.RecID) * 3 AS CekimSayisi3Var
FROM     LineBaseOP INNER JOIN
                  CekimOzelligiBasedOP ON LineBaseOP.LineName = CekimOzelligiBasedOP.LineName AND LineBaseOP.OperationNo = CekimOzelligiBasedOP.OperationNo AND 
                  LineBaseOP.MachineName = CekimOzelligiBasedOP.MachineNumber
WHERE  (LineBaseOP.FactoryId = 1)
GROUP BY LineBaseOP.LineName

输出:

LineName|CekimSayisi3Var|
--------+---------------+
L11     | 255           |
L2      | 255           | 
L3      | 43            |
L4      | 143           |
L5      | 121           |
L6      | 101           | 

我正在尝试像这样对输出进行分组:

L2、L3、L4、L5 作为 FH

L11, L6 为 SH

所以我想要的输出需要如下所示:

GroupName|CekimSayisi3VarGrouped|
---------+----------------------+
FH       | 562                  |
SH       | 356                  | 

有什么建议可以实现吗?

您可以使用 CASE 表达式进行聚合:

SELECT
    CASE WHEN lbop.LineName IN ('L2', 'L3', 'L4', 'L5')
         THEN 'FH'
         WHEN lbop.LineName IN ('L6', 'L11')
         THEN 'SH' END AS LineName,
    COUNT(cobop.RecID) * 3 AS CekimSayisi3Var
FROM LineBaseOP lbop
INNER JOIN CekimOzelligiBasedOP cobop
    ON lbop.LineName = cobop.LineName AND
       lbop.OperationNo = cobop.OperationNo AND 
       lbop.MachineName = cobop.MachineNumber
WHERE
    lbop.FactoryId = 1
GROUP BY
    CASE WHEN lbop.LineName IN ('L2', 'L3', 'L4', 'L5')
         THEN 'FH'
         WHEN lbop.LineName IN ('L6', 'L11')
         THEN 'SH' END;

避免重复 GROUP BY 值的更好语法是将其放入 CROSS APPLY

SELECT
    v.GroupName,
    COUNT(cobop.RecID) * 3 AS CekimSayisi3Var
FROM LineBaseOP lbop
INNER JOIN CekimOzelligiBasedOP cobop
    ON lbop.LineName = cobop.LineName AND
       lbop.OperationNo = cobop.OperationNo AND 
       lbop.MachineName = cobop.MachineNumber
CROSS APPLY (VALUES (
    CASE WHEN lbop.LineName IN ('L2', 'L3', 'L4', 'L5')
         THEN 'FH'
         WHEN lbop.LineName IN ('L6', 'L11')
         THEN 'SH' END
)) v(GroupName)
WHERE
    lbop.FactoryId = 1
GROUP BY
  v.GroupName;