0

クエリに問題があります。ストアのリストがあり、これらの各ストアにはメンバーがあり、メンバーシップにはさまざまなカテゴリ(ブロンズ、シルバー、ゴールドなど)があります。

テーブルは、「ショップ」、「メンバー」、「membership_cards」です。

shops: id, name
members: id, shops_id, membership_id, first_name, last_name
membership_cards: id, description

各店舗の会員数でグループ化した会員数を抽出する必要があります。サーバー側の言語を使用せずにこれを行うことはできますか?

最終的な結果は次のようになります。

ストアの名前、n°bronzeメンバー、n°silver_members、n°gold_members...。

4

3 に答える 3

0

データベーススキーマを知らなければ、その質問に答えるのは少し難しいですが、次のようなものでうまくいくはずです。

SELECT      shop.name,
            SUM(CASE WHEN membership_cards.category = 'Bronze' THEN 1 ELSE 0 END) AS Bronze,
            SUM(CASE WHEN membership_cards.category = 'Silver'THEN 1 ELSE 0 END) AS Silver,
            SUM(CASE WHEN membership_cards.category = 'Gold' THEN 1 ELSE 0 END) AS Gold
FROM        shops
INNER JOIN  members
ON          shop.id = members.shopid
INNER JOIN  membership_cards 
ON          members.id = membership_cards.memberid
GROUP BY    shop.name

列名を使用している名前に変更するだけです。

于 2012-07-17T13:37:59.280 に答える
0

提供した内容に基づいて、次のようなクエリが必要です。

select shopid,
       sum(case when c.cardtype = 'Bronze' then 1 else 0 end) as Bronze,
       sum(case when c.cardtype = 'Silver' then 1 else 0 end) as Silver,
       sum(case when c.cardtype = 'Gold' then 1 else 0 end) as Gold
from shops s left outer join
     members m
     on s.shopid = m.shopid left outer join
     cards c
     on c.memberid = m.memberid
group by shopid

各グループのカードではなく、メンバーの数を知りたい場合(メンバーが複数のカードを持つことができる場合)、sum()式を次のように置き換えます。

count(case when c.cardtype = 'Bronze' then m.memberid end)
于 2012-07-17T13:38:37.227 に答える
0
SELECT B.name,A.Bronze,A.Silver,A.Gold    
FROM
(
    SELECT S.id,
        SUM(IF(IFNULL(C.cardtype,'')='Bronze',1,0)) Bronze,
        SUM(IF(IFNULL(C.cardtype,'')='Silver',1,0)) Silver,
        SUM(IF(IFNULL(C.cardtype,'')='Gold'  ,1,0)) Gold
    FROM shops S
    LEFT JOIN members M ON S.id = M.shops_id
    LEFT JOIN membership_cards C ON M.membership_id = C.id
    GROUP BY S.id
) A
INNER JOIN shops B USING (id);

メンバーがカードを持っていない場合に備えて、 IFNULL関数を使用しました

于 2012-07-17T13:46:01.853 に答える