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

同じ列のすべてのフィールド間の OR のように、各列の項目のいずれかに 1 があるかどうかを示すクエリを作成する必要があり、次のような出力が得られます。

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 であることを確認します。CASECLの回答をお勧めしますが、質問のステートメントの問題を説明しているため、この回答をここに残します。

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 では、基本式が 1 回だけ評価され、その結果が左から右の各 WHEN 式の評価と比較されます。CASE 式の結果は、比較が真である最初の WHEN 式に対応する THEN 式の評価です...

書かれているステートメントでは、caseステートメントは常に1、列がである場合と列が1である場合に評価されました。したがって、それらは常に一致し、合計は常に行数でした。00

更新:これを実際にどのようにあなたが望む結果に変えるのですか?1 つの方法を次に示します。

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 に答える