【问题标题】:"Collapse" table to eliminate null values“折叠”表以消除空值
【发布时间】:2011-05-24 03:05:41
【问题描述】:

我有一个允许在 GUI 中创建自定义字段的产品。我创建了三个字段:系统发货日期、系统保修结束日期和系统保修说明。遗憾的是,系统将这些填充为行,而不是列。

例子:

Machine_GroupID      | agentGuid | fieldName                |  fieldValue
-----------------------------------------------------------------------------
systemABC.companyABC | 57537921  | System Ship Date         | 1/1/1900
systemABC.companyABC | 57537921  | System Warranty End Date | 1/1/1950
systemABC.companyABC | 57537921  | System Warranty Notes    | Test notes
system123.companyABC | 48394844  | System Ship Date         | 1/1/1900
system123.companyABC | 48394844  | System Warranty End Date | 1/1/1950
system123.companyABC | 48394844  | System Warranty Notes    | Test notes
systemXYZ.companyABC | 99948403  | System Ship Date         | 1/1/1900
systemXYZ.companyABC | 99948403  | System Warranty End Date | 1/1/1950
systemXYZ.companyABC | 99948403  | System Warranty Notes    | Test notes

我需要将系统发货日期作为一列返回,系统保修结束日期作为一列返回,系统保修说明作为一列返回。如果我使用 CASE WHEN 语句:

CASE WHEN sim.fieldName = 'System Ship Date' 
     THEN sim.fieldValue END AS 'System Ship Date',
CASE WHEN sim.fieldName = 'System Warranty End Date' 
     THEN sim.fieldValue END AS 'System Warranty End Date',
CASE WHEN sim.fieldName = 'System Warranty Notes' 
     THEN sim.fieldValue END AS 'System Warranty Notes'

数据显示在每台计算机上:

header1 header2 header3
数据1 NULL NULL
NULL 数据2 NULL
NULL NULL 数据3

我需要它看起来像这样:

header1 header2 header3
数据1 数据2 数据3

我以为我可以以某种方式使用 MAX(),但我是新手,这超出了我的能力。或者,我知道我可以创建一个临时表,但我也不知道。我已经在网上和堆栈上进行了广泛的搜索,但据我所知,这是 CASE WHEN 语句。

【问题讨论】:

  • 听起来您需要一个所谓的数据透视表,但并非每个 RDMS 都支持该功能。哪个是你的?

标签: sql


【解决方案1】:

为什么不自加入?还是保持简单...

SELECT
   s1.Machine_GroupID, s1.agentGuid,
   s1.fieldValue, s2.fieldValue, s3.fieldValue
FROM
   sim s1
   JOIN sim s2 ON s1.Machine_GroupID = s2.Machine_GroupID
   JOIN sim s3 ON s1.Machine_GroupID = s3. Machine_GroupID
WHERE
   s1.fieldName = 'System Ship Date' AND
   s2.fieldName = 'System Warranty End Date' AND
   s2.fieldName = 'System Warranty Notes'

【讨论】:

  • 不要忘记使用LEFT JOINs,除非保证所有 Machine_Groups 都具有所有三个字段。此外,除非存在这样的保证,否则您将需要四次 sim:一次作为基础,然后自连接 3 次,每个字段一次。
  • 很好的答案。我遇到了同样的问题——尝试在不使用聚合的情况下旋转行(我想保留所有不同的值而不选择最大值、最小值、平均值等),这成功了。
【解决方案2】:

在 MS SQL 中:

SELECT
  Machine_GroupID, agentGuid, "System Ship Date", "System Warranty End Date", "System Warranty Notes"
FROM
  (
  SELECT
    Machine_GroupID, agentGuid, fieldName, MAX(fieldValue) AS Value
  FROM
    sim
  GROUP BY
    Machine_GroupID, agentGuid, fieldName
  ) AS X
PIVOT
  (MAX(Value) FOR fieldName IN ("System Ship Date", "System Warranty End Date", "System Warranty Notes")) AS Y

GROUP BY 子句在您的情况下并非绝对必要,但没有它 PIVOT 有时会返回无关的行,就像您的第一个表一样。

【讨论】:

    猜你喜欢
    • 2021-08-13
    • 2021-07-21
    • 1970-01-01
    • 2019-03-11
    • 2015-05-06
    • 2021-04-08
    • 2015-12-10
    • 2018-12-24
    • 1970-01-01
    相关资源
    最近更新 更多