对 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;
我有一个 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;