【问题标题】:SQL Sum table with fixed rows?具有固定行的 SQL Sum 表?
【发布时间】:2014-05-29 11:02:49
【问题描述】:

我有一个查询,我想给出一个固定的表格输出(这样我可以更轻松地在 Excel 中绘制图表)。 查询如下:

SELECT 

Case

WHEN ScrapsReasonID = 2339 THEN 'Box 5'

WHEN ScrapsReasonID = 2340 THEN 'Box 6'

WHEN ScrapsReasonID = 2342 THEN 'Box 7'

WHEN ScrapsReasonID = 2343 THEN 'Box 8'

WHEN ScrapsReasonID = 2344 THEN 'Box 9'

Else 'Unknown'

END 

AS 'BoxNumber',

count(Case When PartNumberID = '378' Then Scraps End) AS '9.5mm',

count(Case When PartNumberID = '379' Then Scraps End) AS '10.0mm',

count(Case When PartNumberID = '380' Then Scraps End) AS '10.5mm'


FROM [ProcessControl].[dbo].[OutputScrap]

WHERE 

MachineId = '93'

And ScrapsReasonID In

(
'2339',
'2340',
'2342',
'2343',
'2344'
)

And PDate Between '22-may-2014' and '29-may-2014'

GROUP BY ScrapsReasonID

如果在设置的日期之间肯定有所有 5 个 scrapreasonID,则此方法有效,但如果只有 3 个,例如我在 Sum 表中只得到 3 行。如果 9.5、10.0、10.5 不存在,是否有办法始终返回所有 5 个 scrapreasonID 和零值?

【问题讨论】:

  • 考虑提供适当的 DDL(和/或 sqlfiddle)以及所需的结果集。
  • 这是 sql-server 我猜你应该正确标记你的问题
  • 去掉了 mysql 标签并添加了 sql-server 标签,因为语法清楚地暗示了 SQL Server。

标签: sql sql-server count sum


【解决方案1】:

您想使用left outer join 而不是case 语句。此外,我正在进行以下更改:

  • count() 更改为sum()。将一个名为 `scraps 的字段中的值相加似乎更合理,尽管我可能错了。
  • 在条件聚合中添加了Else 0。我假设您在没有匹配项时想要 0 而不是 NULL
  • 删除了 ScrapsReasonID 的条件。 join 会进行必要的过滤。
  • 将剩余条件移至on 子句,因此where 不会将外连接变为内连接。
  • 删除了列名的单引号。对于 SQL Server,请使用方括号(由于三部分表命名约定,我假设为 SQL Server)。
  • 将日期格式更改为 ISO 标准 YYYY-MM-DD 格式。

这是结果查询

SELECT bn.BoxNumber,
       SUM(Case When PartNumberID = '378' Then Scraps Else 0 End) AS [9.5mm],
       SUM(Case When PartNumberID = '379' Then Scraps Else 0 End) AS [10.0mm],
       SUM(Case When PartNumberID = '380' Then Scraps Else 0 End) AS [10.5mm]
FROM (SELECT 2339 as ScrapsReasonID, 'Box 5' as BoxNumber UNION ALL
      SELECT 2340, 'Box 6' UNION ALL
      SELECT 2342, 'Box 7' UNION ALL
      SELECT 2343, 'Box 8' UNION ALL
      SELECT 2344, 'Box 9' 
     ) bn LEFT OUTER JOIN
     [ProcessControl].[dbo].[OutputScrap] os
     ON os.ScrapsReasonID = bn.ScrapsReasonID AND
        os.MachineId = '93' AND
        os.PDate Between '2014-05-22' and '2014-05-29'
GROUP BY bn.BoxNumber;

【讨论】:

  • 谢谢,这非常接近工作,我删除了 where 语句并将条件放入 on 语句以防止进一步过滤,现在它可以工作了。 ) bn LEFT JOIN [ProcessControl].[dbo].[OutputScrap] os ON os.ScrapsReasonID = bn.ScrapsReasonID AND PDate between '2014-05-22' AND '2014-05-29' AND MachineId = '93'跨度>
猜你喜欢
  • 2021-11-12
  • 2012-02-13
  • 1970-01-01
  • 2020-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-31
  • 1970-01-01
相关资源
最近更新 更多