0

このような2つのテーブルがある場合

CREATE TABLE ta(`ID` int, `name` char(10));
INSERT INTO ta (`ID`, `name`)
VALUES
    (1, 'A'),
    (2, 'A'),
    (3, 'B'),
    (4, 'C'),
    (5, 'B');

CREATE TABLE yourtable(`ID` int, `Val` int);
INSERT INTO yourtable (`ID`, `Val`)
VALUES
    (1, 10),
    (1, 20),
    (1, 30),
    (1, 30),
    (2, 10),
    (2, 20),
    (3, 20),
    (3, 20),
    (4, 10),
    (4, 20),    
    (5, 10),
    (5, 20),
    (5, 30);

そして、name2 つのテーブルを使用して値をグループ化する必要があります。そして、条件 val=10 OR val=30 の場合、正常に機能します。http://sqlfiddle.com/#!2/9c099/1

select name, count(distinct t1.id)
from yourtable as t1, ta
where t1.id=ta.id
AND (val=10 OR val=30)
group by name

しかし、条件(val=10 AND val!=30)については、どのように照会すればよいでしょうか? そのために、出力は

   Count
A  1
B  0
C  1

以下に例を示します。name=A の場合、ID=1,2 が得られます。したがって、テーブル yourtable には、ID=1,2 の 5 つの行があります。ID=1 の場合、val=10、20、20。ID=2 の場合、val=10,20 です。ここでは、ID=2 のみが (val=10 AND val!=30) を満たすため、name=A count=1 の場合

4

3 に答える 3

0

yourtableIDが条件を満たすかどうかを判断するサブクエリが必要で、それを結合しますta

select name, SUM(Satisfies)
from ta, (
    SELECT distinct ID, CASE WHEN ID NOT IN (
        SELECT ID FROM yourtable
        WHERE Val = 30 )
    AND ID IN (
        SELECT ID FROM yourtable
        WHERE Val = 10 ) THEN 1 ELSE 0 END Satisfies
    FROM yourtable
) t1
WHERE t1.id=ta.id
group by name

SQL フィドル

于 2013-08-08T13:46:35.600 に答える
0
SELECT ta.name
     , COUNT(DISTINCT t2.val)
  FROM yourtable t1 
  LEFT
  JOIN yourtable t2
    ON t2.id = t1.id 
   AND t2.val IN (30) -- <-- things to exclude
  LEFT
  JOIN ta 
    ON ta.id = t1.id 
 WHERE t1.val IN (10) -- <-- things to include
 GROUP
    BY name;

NAME COUNT(T2.VAL)
A    1
B    1
C    0

http://sqlfiddle.com/#!2/9c099/169

于 2013-08-08T13:20:09.703 に答える