1

テーブルmembers(id, contractid, a,b,c,d)で私は数える必要があります:

  1. a、b、c、d>0の少なくとも1つを持つメンバーの数

  2. 特定のコントラクト ID の a>0、b>0 などの行の数 (コントラクトとメンバーの関係は 1 対多です)。

私の目標は、契約で a、b、c、および d を選択したメンバーの数に関する情報をグループ化したグラフ (テーブル) を表示することです。

4

2 に答える 2

2

0 または 1 を返すブール値テストと組み合わせて集計を使用することにより、SUM()入力されている数を判断できます。

少なくとも 1 つが入力されているメンバーの数:

SELECT COUNT(*) 
FROM members
/* add up the boolean comparisons (which return 0 or 1) to find out if the total is > 0 */
WHERE ((a > 0) + (b > 0) + (c > 0) + (d > 0)) > 0
/* Actually that's overkill, and it could just be an OR chain */
/* WHERE a > 0 OR b > 0 OR c > 0 OR d > 0 */

契約 ID ごとの数

SELECT
  contractid,
  /* SUM() a 1 for each row in which the col is > 0 */
  SUM(CASE WHEN a > 0 THEN 1 ELSE 0 END) AS a_greater_than_0,
  SUM(CASE WHEN b > 0 THEN 1 ELSE 0 END) AS b_greater_than_0,
  SUM(CASE WHEN c > 0 THEN 1 ELSE 0 END) AS c_greater_than_0,
  SUM(CASE WHEN d > 0 THEN 1 ELSE 0 END) AS d_greater_than_0
FROM members
GROUP BY contractid

(a > 0)MySQL では1 または 0 が返されるため、これを短縮できますが、他のすべての RDBMS には移植できません。

SELECT
  contractid,
  /* SUM() a 1 for each row in which the col is > 0 */
  SUM(a > 0) AS a_greater_than_0,
  SUM(b > 0) AS b_greater_than_0,
  SUM(c > 0) AS c_greater_than_0,
  SUM(d > 0) AS d_greater_than_0
FROM members
GROUP BY contractid
于 2012-06-20T17:12:25.763 に答える
0
  1. select count(id) from Members where (a>0 or b>0 or c>0 or d>0)

  2. select contractid,count(id) from members group by contractid having a>0;
    select contractid,count(id) from members group by contractid having b>0;

于 2012-06-20T17:12:20.550 に答える