0

我有以下查询:

SELECT c.danhoEstetico, c.danhoDirecto
FROM conceptos c
INNER JOIN materialesconceptos mc ON mc.idConcepto = c.idConcepto
INNER JOIN materiales m ON m.idMaterial = mc.idMaterial
WHERE m.idMaterial IN (4,11,11)

这会产生以下结果(例如):

danhoEstetico | danhoDirecto
1             | 0
1             | 0
0             | 0
0             | 0

我需要做一个查询,如果每列中的任何项目都有一个 1,比如同一列中所有字段之间的 OR,输出如下:

danhoEstetico | danhoDirecto
1             | 0

我试过了:

SELECT
SUM(CASE c.danhoEstetico WHEN c.danhoEstetico=1 THEN 1 ELSE 0 END) AS de,
SUM(CASE c.danhoDirecto WHEN c.danhoDirecto=1 THEN 1 ELSE 0 END) AS dd
FROM conceptos c INNER JOIN materialesconceptos mc ON mc.idConcepto = c.idConcepto
INNER JOIN materiales m ON m.idMaterial = mc.idMaterial
WHERE m.idMaterial IN (4,11,11)

出于某种原因,这会产生:

danhoEstetico | danhoDirecto
4             | 4

对此有任何提示吗?

4

3 回答 3

1

要获取每列中的最大值,请使用MAX而不是SUM.

于 2012-10-25T08:40:34.067 回答
1

编辑:我误读了这个问题。此解决方案检查列中的每一行是否为 1,而不是任何行。我推荐 CL 的答案,但我将把这个答案留在这里,因为它解释了问题中的CASE陈述存在问题。

您应该在CASE没有基本表达式的情况下使用:

SELECT
SUM(CASE WHEN c.danhoEstetico=1 THEN 1 ELSE 0 END) AS de,
SUM(CASE WHEN c.danhoDirecto=1 THEN 1 ELSE 0 END) AS dd
FROM conceptos c INNER JOIN materialesconceptos mc ON 
    mc.idConcepto = c.idConcepto
INNER JOIN materiales m ON m.idMaterial = mc.idMaterial
WHERE m.idMaterial IN (4,11,11)

文档中

在具有基本表达式的 CASE 中,基本表达式只计算一次,并将结果与​​从左到右的每个 WHEN 表达式的计算进行比较。CASE 表达式的结果是 THEN 表达式的求值,该表达式对应于比较为真的第一个 WHEN 表达式...

在您所写的陈述中,该case陈述始终评估1为该列何时为1以及0该列何时为0。因此,它们总是匹配的,总和总是行数。

更新:现在你如何把它变成你想要的结果?这是一种方法:

SELECT
SUM(CASE WHEN c.danhoEstetico=1 THEN 1 ELSE 0 END) / SUM(1) AS de,
SUM(CASE WHEN c.danhoDirecto=1 THEN 1 ELSE 0 END) / SUM(1)  AS dd
FROM conceptos c INNER JOIN materialesconceptos mc ON 
    mc.idConcepto = c.idConcepto
INNER JOIN materiales m ON m.idMaterial = mc.idMaterial
WHERE m.idMaterial IN (4,11,11)

这利用了整数运算。如果不是一列中的所有行都为 1,则除法将导致值 < 1,小于 1 的值将显示为零。

于 2012-10-25T08:41:18.327 回答
0
select distinct 
       c.danhoEstetico, c.danhoDirecto
 FROM conceptos c
 INNER JOIN materialesconceptos mc ON mc.idConcepto = c.idConcepto
 INNER JOIN materiales m ON m.idMaterial = mc.idMaterial
where 1 in (c.danhoEstetico , c.danhoDirecto)
于 2012-10-25T08:39:00.730 回答