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 回答