SUM case when 语句格式化时的正确语法
Proper syntax when SUM case when statement is formatted
我正在尝试对数据库中的两个不同值求和。
Species
可以是 12 或 14。我在 select 语句中删除了其余部分。
我想对物种值为 12 的所有行进行合计或 SUM
,当物种值为 14 时也一样。
我不明白如何格式化语法。这是我的查询:
SELECT h.HarvestDate, c.LotNo, h.Producer, c.species
SUM CASE WHEN c.Species = 12 THEN LambYT ELSE 0 as LambYT
SUM CASE WHEN c.Species = 14 THEN LambYTSpoolJoint ELSE 0 as LambYTSpoolJoint
FROM BANSS.dbo.DixonCarcass_InProcess c, BANSS.dbo.HarvestData_SFDCApp h
WHERE c.LotNo = h.Lot
AND c.Species in (12, 14)
AND h.Program not LIKE 'K&R%'
GROUP BY h.HarvestDate, c.LotNo, h.Producer
但是我认为这是不正确的。我想要一个 SUM
其中 Species = 12
和一个总和 Species = 14
以及两个总和的总和 TOTAL
.
我不清楚你到底想要什么,但试试这个:
SELECT
h.HarvestDate,
c.LotNo,
h.Producer,
c.species,
SUM(LambYT) AS LambYT,
SUM(LambYTSpoolJoint) AS LambYTSpoolJoint
FROM
BANSS.dbo.DixonCarcass_InProcess c,
BANSS.dbo.HarvestData_SFDCApp h
WHERE
c.LotNo = h.Lot
AND c.Species IN (12, 14)
AND h.Program NOT LIKE 'K&R%'
GROUP BY
h.HarvestDate,
c.LotNo,
h.Producer,
c.species
或者,如 Tim B. 建议的那样,尝试:
SELECT
h.HarvestDate,
c.LotNo,
h.Producer,
c.species,
SUM(CASE WHEN c.Species = 12 THEN LambYT ELSE 0 END) AS LambYT,
SUM(CASE WHEN c.species = 14 THEN LambYTSpoolJoint ELSE 0 END) AS LambYTSpoolJoint
FROM
BANSS.dbo.DixonCarcass_InProcess c,
BANSS.dbo.HarvestData_SFDCApp h
WHERE
c.LotNo = h.Lot
AND c.Species IN (12, 14)
AND h.Program NOT LIKE 'K&R%'
GROUP BY
h.HarvestDate,
c.LotNo,
h.Producer,
c.species
或者,更好的是,
SELECT
h.HarvestDate,
c.LotNo,
h.Producer,
c.species,
CASE WHEN c.Species = 12 THEN SUM(LambYT) ELSE SUM(LambYTSpoolJoint) END AS LambYT
FROM
BANSS.dbo.DixonCarcass_InProcess c,
BANSS.dbo.HarvestData_SFDCApp h
WHERE
c.LotNo = h.Lot
AND c.Species IN (12, 14)
AND h.Program NOT LIKE 'K&R%'
GROUP BY
h.HarvestDate,
c.LotNo,
h.Producer,
c.species
试试这个查询:
SELECT h.HarvestDate,
c.LotNo,
h.Producer,
SUM(CASE WHEN c.Species = 12 THEN 1 ELSE 0 END) AS LambYT,
SUM(CASE WHEN c.species = 14 THEN 1 ELSE 0 END) AS LambYTSpoolJoint,
SUM(CASE WHEN c.Species = 12 THEN 1 ELSE 0 END) +
SUM(CASE WHEN c.species = 14 THEN 1 ELSE 0 END) AS TOTAL
FROM BANSS.dbo.DixonCarcass_InProcess c
INNER JOIN BANSS.dbo.HarvestData_SFDCApp h
ON c.LotNo = h.Lot
WHERE c.Species IN (12, 14) AND
h.Program NOT LIKE 'K&R%'
GROUP BY h.HarvestDate, c.LotNo, h.Producer
备注:
无法通过单一聚合来获得总数,因为物种 12 和 14 的求和列不同。因此,我只是将各自的 CASE
表达式加在一起。
你不能 select c.species
因为它没有出现在你的 SELECT
列表中并且它不在聚合函数中。
我将您的隐式连接替换为显式连接,其中连接条件出现在 ON
子句中。这是现在公认的标准,它使您的查询更容易阅读。
我正在尝试对数据库中的两个不同值求和。
Species
可以是 12 或 14。我在 select 语句中删除了其余部分。
我想对物种值为 12 的所有行进行合计或 SUM
,当物种值为 14 时也一样。
我不明白如何格式化语法。这是我的查询:
SELECT h.HarvestDate, c.LotNo, h.Producer, c.species
SUM CASE WHEN c.Species = 12 THEN LambYT ELSE 0 as LambYT
SUM CASE WHEN c.Species = 14 THEN LambYTSpoolJoint ELSE 0 as LambYTSpoolJoint
FROM BANSS.dbo.DixonCarcass_InProcess c, BANSS.dbo.HarvestData_SFDCApp h
WHERE c.LotNo = h.Lot
AND c.Species in (12, 14)
AND h.Program not LIKE 'K&R%'
GROUP BY h.HarvestDate, c.LotNo, h.Producer
但是我认为这是不正确的。我想要一个 SUM
其中 Species = 12
和一个总和 Species = 14
以及两个总和的总和 TOTAL
.
我不清楚你到底想要什么,但试试这个:
SELECT
h.HarvestDate,
c.LotNo,
h.Producer,
c.species,
SUM(LambYT) AS LambYT,
SUM(LambYTSpoolJoint) AS LambYTSpoolJoint
FROM
BANSS.dbo.DixonCarcass_InProcess c,
BANSS.dbo.HarvestData_SFDCApp h
WHERE
c.LotNo = h.Lot
AND c.Species IN (12, 14)
AND h.Program NOT LIKE 'K&R%'
GROUP BY
h.HarvestDate,
c.LotNo,
h.Producer,
c.species
或者,如 Tim B. 建议的那样,尝试:
SELECT
h.HarvestDate,
c.LotNo,
h.Producer,
c.species,
SUM(CASE WHEN c.Species = 12 THEN LambYT ELSE 0 END) AS LambYT,
SUM(CASE WHEN c.species = 14 THEN LambYTSpoolJoint ELSE 0 END) AS LambYTSpoolJoint
FROM
BANSS.dbo.DixonCarcass_InProcess c,
BANSS.dbo.HarvestData_SFDCApp h
WHERE
c.LotNo = h.Lot
AND c.Species IN (12, 14)
AND h.Program NOT LIKE 'K&R%'
GROUP BY
h.HarvestDate,
c.LotNo,
h.Producer,
c.species
或者,更好的是,
SELECT
h.HarvestDate,
c.LotNo,
h.Producer,
c.species,
CASE WHEN c.Species = 12 THEN SUM(LambYT) ELSE SUM(LambYTSpoolJoint) END AS LambYT
FROM
BANSS.dbo.DixonCarcass_InProcess c,
BANSS.dbo.HarvestData_SFDCApp h
WHERE
c.LotNo = h.Lot
AND c.Species IN (12, 14)
AND h.Program NOT LIKE 'K&R%'
GROUP BY
h.HarvestDate,
c.LotNo,
h.Producer,
c.species
试试这个查询:
SELECT h.HarvestDate,
c.LotNo,
h.Producer,
SUM(CASE WHEN c.Species = 12 THEN 1 ELSE 0 END) AS LambYT,
SUM(CASE WHEN c.species = 14 THEN 1 ELSE 0 END) AS LambYTSpoolJoint,
SUM(CASE WHEN c.Species = 12 THEN 1 ELSE 0 END) +
SUM(CASE WHEN c.species = 14 THEN 1 ELSE 0 END) AS TOTAL
FROM BANSS.dbo.DixonCarcass_InProcess c
INNER JOIN BANSS.dbo.HarvestData_SFDCApp h
ON c.LotNo = h.Lot
WHERE c.Species IN (12, 14) AND
h.Program NOT LIKE 'K&R%'
GROUP BY h.HarvestDate, c.LotNo, h.Producer
备注:
无法通过单一聚合来获得总数,因为物种 12 和 14 的求和列不同。因此,我只是将各自的 CASE
表达式加在一起。
你不能 select c.species
因为它没有出现在你的 SELECT
列表中并且它不在聚合函数中。
我将您的隐式连接替换为显式连接,其中连接条件出现在 ON
子句中。这是现在公认的标准,它使您的查询更容易阅读。