0

このSQLクエリの最後に到達するのに問題があります。

テーブル:

--Tickets--         --Finance--          --Access--
id_tickets          id_finance           id_access
name_tickets        id_event             id_event
cat_tickets         id_tickets           id_tickets
                    sold_finance         scan_access

FinanceとAccessの両方に、チケットにリストされている各チケットタイプの複数の行が含まれています。そして私は取得しようとしています:

cat_tickets | total_sold | total_scan
-------------------------------------
single      | 3043       | 2571
season      | 481        | 292
comp        | 114        | 75
-------------------------------------
total       | 3638       | 2938

私が使用した結果に最も近いもの:

SELECT tickets.cat_tickets, COALESCE(SUM(finance.sold_finance), 0) AS total_sold, COALESCE(SUM(access.scan_access), 0) AS total_scan
FROM finance INNER JOIN tickets ON finance.id_tickets = tickets.id_tickets
INNER JOIN access ON access.id_tickets = tickets.id_tickets
WHERE access.id_event = 235 AND finance.id_event = access.id_event
GROUP BY tickets.cat_tickets
ORDER BY tickets.cat_tickets DESC

しかし、それはただ戻ります:

cat_tickets | total_sold | total_scan
-------------------------------------
single      | 4945       | 4437
season      | 954        | 599
comp        | 342        | 375
-------------------------------------
total       | 6241       | 5411

私が間違っている可能性のあるアイデアはありますか?ありがとう!

4

3 に答える 3

0

あなたが何を望んでいるのかは完全に明確ですが、このクエリの結果が期待どおりである場合は、このクエリを試してください.

SELECT tickets.cat_tickets, COALESCE(SUM(finance.sold_finance), 0) AS total_sold, COALESCE(SUM(access.scan_access), 0) AS total_scan
FROM finance LEFT JOIN tickets ON finance.id_tickets = tickets.id_tickets
LEFT JOIN access ON access.id_tickets = tickets.id_tickets
WHERE access.id_event = 235
GROUP BY tickets.cat_tickets
ORDER BY tickets.cat_tickets DESC
于 2013-02-03T10:19:38.560 に答える
0

免責事項:質問のデータが不完全なため、このクエリはテストされていません。

SELECT  z.Cat_tickets,
        COALESCE(x.total_sold,0) total_sold,
        COALESCE(y.total_scan,0) total_scan
FROM    tickets z
        LEFT JOIN
        (
            SELECT  a.id_tickets,
                    a.cat_tickets, 
                    SUM(b.sold_finance) total_sold
            FROM    tickets a
                    INNER JOIN finance b
                        ON a.id_tickets = b.id_tickets
            WHERE   id_event = 235
            GROUP   BY a.id_tickets, a.cat_tickets
        ) x ON z.id_tickets = x.id_tickets
        LEFT JOIN
        (
            SELECT  aa.id_tickets,
                    aa.cat_tickets, 
                    SUM(bb.scan_access) total_scan
            FROM    tickets aa
                    INNER JOIN Access bb
                        ON aa.id_tickets = bb.id_tickets
            WHERE   id_event = 235
            GROUP   BY aa.id_tickets, aa.cat_tickets
        ) y ON z.id_tickets = y.id_tickets
于 2013-02-03T10:20:24.540 に答える
0

access問題はとfinanceテーブルの関係ですjoin。あなたLEFT JOINがテーブルであっても、述語finance.id_event = access.id_eventはそれを作りますINNER JOIN。回避策として、次のUNIONように使用します。

SELECT 
  tickets.cat_tickets, 
  SUM(CASE WHEN a.Type = 'f' THEN num ELSE 0 END) AS total_sold,
  SUM(CASE WHEN a.Type = 'a' THEN num ELSE 0 END) AS total_scan
FROM tickets 
LEFT JOIN
( 
  SELECT 'f' Type, id_tickets, sold_finance num
  FROM finance f
  WHERE id_event = 1
  UNION ALL
  SELECT 'a', id_tickets, scan_access
  FROM access 
  WHERE id_event = 1
) a ON a.id_tickets = tickets.id_tickets
GROUP BY tickets.cat_tickets;

SQL フィドルのデモ

于 2013-02-03T10:21:10.650 に答える