【问题标题】:Compare multiple columns: If identical value 1 otherwise 0比较多列:如果相同的值 1 否则 0
【发布时间】:2013-10-07 17:11:27
【问题描述】:

我有一个大型的公司配对数据集,其中包含他们的资助风险投资家,我想检查这些配对中是否只有一个合伙人由 VC 资助(如果是,列 OVC=1,否则为 0),两个合伙人都由至少一个 VC(如果是,列 BVB=1)或两个合作伙伴是否由同一个 VC 资助(如果是,列 CVC=1)。目前,我的表格有列 Partner11 及其资助 VC VC11 到 VC17 和 Partner22 列及其资助 VC21 到 VC27。为了能够在一行中说明标题,我在下表中省略了 VC14-VC17 和 VC24-27。

Partner11 | VC11 | VC12 | VC13 | Partner22 | VC21 | VC22 | VC23 | OVB | BVB | CVC

FirmA     |      |      |      | FirmB     |      |      |      |  0  |  0  |  0
FirmC     | Moa  |      |      | FirmD     |      |      |      |  1  |  0  |  0 
FirmE     | Moa  | Fred | Bob  | FirmF     |      |      |      |  1  |  0  |  0
FirmG     |      |      |      | FirmH     |  Bob | Zoe  | Jet  |  1  |  0  |  0 
FirmE     | Moa  |      |      | FirmF     |  Jet |      |      |  0  |  1  |  0
FirmG     | Moa  | Fred | Bob  | FirmH     |  Jet | Zoe  |      |  0  |  1  |  0 
FirmG     | Moa  | Fred | Bob  | FirmH     |  Bob | Zoe  | Jet  |  0  |  0  |  1
FirmG     | Jet  | Bob  | Fred | FirmH     |  Bob | Zoe  | Jet  |  0  |  0  |  1

如果没有合作伙伴获得风投支持,OVB、BVB 和 CVC 的值为 0(见第 1 行)。

要在 OVB 列中插入 0 或 1,代码应检查对中的一个伙伴是否在 partner11 的列 VC11-VC17 或(不包括)在 partner22 的列 VC21-VC27 中具有至少一个值(见第 2 至 4 行)。

要在 BVB 列中插入 0 或 1,代码应检查两个伙伴是否至少在其 VC 列之一中具有值(对于 VC11-VC17 中的 partner11,对于 VC21-VC27 中的 partner22)(参见行5+6)。

要在CVC列中插入0或1,代码需要比较伙伴的VC列的值,也就是说VC11应该与VC21、VC22、VC23、VC24、VC25、VC26和VC27进行比较; VC12 与 VC21、VC22、VC23、VC24、VC25、VC26、VC27 等(见第 7+8 行)。

我非常感谢任何帮助解决这个问题。

非常感谢您。

【问题讨论】:

  • 神圣的非标准化表蝙蝠侠!
  • 我之前在 Excel 中使用 IF 语句对其进行了编程,但后来我的数据表变得太大,我不得不切换到 SQL。因此,该表可能是如此非规范化。对不起!
  • 你确实需要规范你的数据结构——除非有一些(尚不明显)VC11 和 VC12 不同的原因。如果您有应该具有可比性的值,那么它们应该在 same 列中(在单独的行中)
  • 是的 - 我同意......现在停下来,让你的表格结构正确。从现在开始,这将为您省去麻烦。

标签: sql sql-server compare case


【解决方案1】:

嗯,这是我写过的最糟糕的查询。但是,当您的表格未标准化时,这就是您最终得到的结果。让我知道这是否有帮助:

运行以下命令更新OVBBVBCVC (SQL Fiddle):

UPDATE MyTable
SET OVB = 
CASE(
  CASE(
    (CASE Datalength(VC11) WHEN 0 THEN 0 ELSE 1 END) +
    (CASE Datalength(VC12) WHEN 0 THEN 0 ELSE 1 END) +
    (CASE Datalength(VC13) WHEN 0 THEN 0 ELSE 1 END) +
    (CASE Datalength(VC14) WHEN 0 THEN 0 ELSE 1 END) +
    (CASE Datalength(VC15) WHEN 0 THEN 0 ELSE 1 END) +
    (CASE Datalength(VC16) WHEN 0 THEN 0 ELSE 1 END) +
    (CASE Datalength(VC17) WHEN 0 THEN 0 ELSE 1 END) 
  ) WHEN 0 THEN 0 ELSE 1 END 
  +
  CASE(
    (CASE Datalength(VC21) WHEN 0 THEN 0 ELSE 1 END) +
    (CASE Datalength(VC22) WHEN 0 THEN 0 ELSE 1 END) +
    (CASE Datalength(VC23) WHEN 0 THEN 0 ELSE 1 END) +
    (CASE Datalength(VC24) WHEN 0 THEN 0 ELSE 1 END) +
    (CASE Datalength(VC25) WHEN 0 THEN 0 ELSE 1 END) +
    (CASE Datalength(VC26) WHEN 0 THEN 0 ELSE 1 END) +
    (CASE Datalength(VC27) WHEN 0 THEN 0 ELSE 1 END) 
  ) WHEN  0 THEN 0 ELSE 1 END
) WHEN 1 THEN 1 ELSE 0 END
, BVB = 
CASE(
  CASE(
    (CASE Datalength(VC11) WHEN 0 THEN 0 ELSE 1 END) +
    (CASE Datalength(VC12) WHEN 0 THEN 0 ELSE 1 END) +
    (CASE Datalength(VC13) WHEN 0 THEN 0 ELSE 1 END) +
    (CASE Datalength(VC14) WHEN 0 THEN 0 ELSE 1 END) +
    (CASE Datalength(VC15) WHEN 0 THEN 0 ELSE 1 END) +
    (CASE Datalength(VC16) WHEN 0 THEN 0 ELSE 1 END) +
    (CASE Datalength(VC17) WHEN 0 THEN 0 ELSE 1 END) 
  ) WHEN 0 THEN 0 ELSE 1 END 
  +
  CASE(
    (CASE Datalength(VC21) WHEN 0 THEN 0 ELSE 1 END) +
    (CASE Datalength(VC22) WHEN 0 THEN 0 ELSE 1 END) +
    (CASE Datalength(VC23) WHEN 0 THEN 0 ELSE 1 END) +
    (CASE Datalength(VC24) WHEN 0 THEN 0 ELSE 1 END) +
    (CASE Datalength(VC25) WHEN 0 THEN 0 ELSE 1 END) +
    (CASE Datalength(VC26) WHEN 0 THEN 0 ELSE 1 END) +
    (CASE Datalength(VC27) WHEN 0 THEN 0 ELSE 1 END) 
  ) WHEN  0 THEN 0 ELSE 1 END
) WHEN 2 THEN 1 ELSE 0 END
, CVC = 
CASE WHEN   
  CASE WHEN
    (CASE Datalength(VC11) WHEN 0 THEN 0 ELSE 
    (CASE WHEN VC11 = VC21 THEN 1 ELSE 0 END) +
    (CASE WHEN VC11 = VC22 THEN 1 ELSE 0 END) +
    (CASE WHEN VC11 = VC23 THEN 1 ELSE 0 END) +
    (CASE WHEN VC11 = VC24 THEN 1 ELSE 0 END) +
    (CASE WHEN VC11 = VC25 THEN 1 ELSE 0 END) +
    (CASE WHEN VC11 = VC26 THEN 1 ELSE 0 END) +
    (CASE WHEN VC11 = VC27 THEN 1 ELSE 0 END) END) >= 1
  THEN 1 ELSE 0 END
  +
  CASE WHEN
    (CASE Datalength(VC12) WHEN 0 THEN 0 ELSE 
    (CASE WHEN VC12 = VC21 THEN 1 ELSE 0 END) +
    (CASE WHEN VC12 = VC22 THEN 1 ELSE 0 END) +
    (CASE WHEN VC12 = VC23 THEN 1 ELSE 0 END) +
    (CASE WHEN VC12 = VC24 THEN 1 ELSE 0 END) +
    (CASE WHEN VC12 = VC25 THEN 1 ELSE 0 END) +
    (CASE WHEN VC12 = VC26 THEN 1 ELSE 0 END) +
    (CASE WHEN VC12 = VC27 THEN 1 ELSE 0 END) END) >= 1
  THEN 1 ELSE 0 END
  +
  CASE WHEN
    (CASE Datalength(VC13) WHEN 0 THEN 0 ELSE 
    (CASE WHEN VC13 = VC21 THEN 1 ELSE 0 END) +
    (CASE WHEN VC13 = VC22 THEN 1 ELSE 0 END) +
    (CASE WHEN VC13 = VC23 THEN 1 ELSE 0 END) +
    (CASE WHEN VC13 = VC24 THEN 1 ELSE 0 END) +
    (CASE WHEN VC13 = VC25 THEN 1 ELSE 0 END) +
    (CASE WHEN VC13 = VC26 THEN 1 ELSE 0 END) +
    (CASE WHEN VC13 = VC27 THEN 1 ELSE 0 END) END) >= 1
  THEN 1 ELSE 0 END
  +
  CASE WHEN
    (CASE Datalength(VC14) WHEN 0 THEN 0 ELSE 
    (CASE WHEN VC14 = VC21 THEN 1 ELSE 0 END) +
    (CASE WHEN VC14 = VC22 THEN 1 ELSE 0 END) +
    (CASE WHEN VC14 = VC23 THEN 1 ELSE 0 END) +
    (CASE WHEN VC14 = VC24 THEN 1 ELSE 0 END) +
    (CASE WHEN VC14 = VC25 THEN 1 ELSE 0 END) +
    (CASE WHEN VC14 = VC26 THEN 1 ELSE 0 END) +
    (CASE WHEN VC14 = VC27 THEN 1 ELSE 0 END) END) >= 1
  THEN 1 ELSE 0 END
  +
  CASE WHEN
    (CASE Datalength(VC15) WHEN 0 THEN 0 ELSE 
    (CASE WHEN VC15 = VC21 THEN 1 ELSE 0 END) +
    (CASE WHEN VC15 = VC22 THEN 1 ELSE 0 END) +
    (CASE WHEN VC15 = VC23 THEN 1 ELSE 0 END) +
    (CASE WHEN VC15 = VC24 THEN 1 ELSE 0 END) +
    (CASE WHEN VC15 = VC25 THEN 1 ELSE 0 END) +
    (CASE WHEN VC15 = VC26 THEN 1 ELSE 0 END) +
    (CASE WHEN VC15 = VC27 THEN 1 ELSE 0 END) END) >= 1
  THEN 1 ELSE 0 END
  +
  CASE WHEN
    (CASE Datalength(VC16) WHEN 0 THEN 0 ELSE 
    (CASE WHEN VC16 = VC21 THEN 1 ELSE 0 END) +
    (CASE WHEN VC16 = VC22 THEN 1 ELSE 0 END) +
    (CASE WHEN VC16 = VC23 THEN 1 ELSE 0 END) +
    (CASE WHEN VC16 = VC24 THEN 1 ELSE 0 END) +
    (CASE WHEN VC16 = VC25 THEN 1 ELSE 0 END) +
    (CASE WHEN VC16 = VC26 THEN 1 ELSE 0 END) +
    (CASE WHEN VC16 = VC27 THEN 1 ELSE 0 END) END) >= 1
  THEN 1 ELSE 0 END
  +
  CASE WHEN
    (CASE Datalength(VC17) WHEN 0 THEN 0 ELSE 
    (CASE WHEN VC17 = VC21 THEN 1 ELSE 0 END) +
    (CASE WHEN VC17 = VC22 THEN 1 ELSE 0 END) +
    (CASE WHEN VC17 = VC23 THEN 1 ELSE 0 END) +
    (CASE WHEN VC17 = VC24 THEN 1 ELSE 0 END) +
    (CASE WHEN VC17 = VC25 THEN 1 ELSE 0 END) +
    (CASE WHEN VC17 = VC26 THEN 1 ELSE 0 END) +
    (CASE WHEN VC17 = VC27 THEN 1 ELSE 0 END) END) >= 1
  THEN 1 ELSE 0 END >= 1
THEN 1 ELSE 0 END

【讨论】:

  • 感谢您的回复,久等了。不幸的是,在运行您的代码时,错误消息“缺少对象或列名或为空。对于 SELECT INTO 语句,请验证每列是否有名称。对于其他语句,请查找空别名。别名定义为“”或 []不允许。添加名称或单个空格作为别名。”从第 4 行开始出现,即使列 OVB、BVB、CVC 以 smallint null 形式存在。行中的第一个“”被标记为错误的语法。这些错误的原因可能是什么?
  • 我修改了我的答案。尝试分别运行每个更新查询,看看它们是否有效。
  • 对于所有查询,都会弹出错误“关键字'AS'附近的语法不正确”。另一个以“对象列名...”开头的错误消息也出现在第 4 行以后。
  • 我更新了第一个查询以使用 CASE 表达式。试试看,让我知道它是否适合你。如果是这样,那么我可以转换其他两个更新语句。
  • 第5ff行的,""好像有问题。 SQL 服务器识别表和所有列,但再次用红色下划线“”,并显示错误消息“缺少对象或列名或为空。对于 SELECT INTO ...”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-18
相关资源
最近更新 更多