【问题标题】:Substitute 2 SQL/ORACLE requests by only one request仅用一个请求替换 2 个 SQL/ORACLE 请求
【发布时间】:2025-11-21 16:35:03
【问题描述】:

我试图在一个请求中获取两个请求的结果,以下两个请求是有效的,每个请求都会生成一个包含两列的表:

SELECT patron.last_name, COUNT(*) AS **pret**
FROM circ_transaction_log INNER JOIN patron ON     circ_transaction_log.patron_id=patron.patron_id
AND **circ_transaction_log.transaction_type<5**
AND patron.college_or_school = 'High School'
GROUP BY patron.last_name;

姓氏 | pret
________________
史蒂文·格雷尔 | 552
米歇尔·文斯 | 122 ...

_______________ _________________________

SELECT patron.last_name, COUNT(*) AS **resa**
FROM circ_transaction_log INNER JOIN patron ON    circ_transaction_log.patron_id=patron.patron_id
AND **circ_transaction_log.transaction_type BETWEEN 5 AND 10**
AND patron.college_or_school = 'High School'
GROUP BY patron.last_name;

姓氏 | 雷萨
________________
史蒂文·格雷尔 | 12
米歇尔·文斯 | 8
...

我想得到的结果是这样的:

姓氏 | 雷萨 | pret
______________________________
史蒂文·格雷尔 |第552章12
米歇尔·文斯 | 122 | 8
...

但我认为困难在于我请求同一个表两次计数(表 CIRC_TRANSACTION_LOG),而无论我尝试的是错误还是不工作

提前感谢您的回复

问候, 尼克

【问题讨论】:

  • MySQL 和 SQL Server 和 Oracle?你真的用了这三个???
  • 加入您对姓氏的两个请求(查询)

标签: mysql sql sql-server oracle


【解决方案1】:

您可以通过使用(last_name) 的结果表的完全外部联接 组合查询。这应该会产生预期的结果。试图创建查询...

Select * from
(SELECT patron.last_name, COUNT(*) AS pret
 FROM circ_transaction_log INNER JOIN patron ON circ_transaction_log.patron_id=patron.patron_id
 AND circ_transaction_log.transaction_type<5
 AND patron.college_or_school = 'High School'
 GROUP BY patron.last_name) 
FULL OUTER JOIN
(SELECT patron.last_name, COUNT(*) AS resa
FROM circ_transaction_log INNER JOIN patron ON circ_transaction_log.patron_id=patron.patron_id
AND circ_transaction_log.transaction_type BETWEEN 5 AND 10
AND patron.college_or_school = 'High School'
GROUP BY patron.last_name) 
USING (last_name)

;

【讨论】:

    【解决方案2】:

    我更喜欢这种方法。如果该行符合您的条件,则在列中输入 1,如果不匹配,则输入 0。然后,当您将所有值相加时,它会为您提供匹配的行数。这允许您为不同的条件创建不同的总和。

    SELECT
        PatronCounts.last_name,
        SUM(PatronCounts.Pret) Pret,
        SUM(PatronCounts.Resa) Resa
    FROM
    (SELECT 
        patron.last_name, 
        CASE WHEN circ_transaction_log.transaction_type < 5 THEN 1 ELSE 0 END AS Pret,
        CASE WHEN circ_transaction_log.transaction_type BETWEEN 5 AND 10 THEN 1 ELSE 0 END AS Resa,
    FROM 
        circ_transaction_log 
        INNER JOIN patron ON circ_transaction_log.patron_id=patron.patron_id 
    WHERE
        patron.college_or_school = 'High School'
    GROUP BY 
        patron.last_name) PatronCounts
    

    【讨论】:

      【解决方案3】:

      你在追求这样的东西,那么:

      SELECT   p.last_name, 
               COUNT(case when ctl.transaction_type < 5 then 1 end) AS pret,
               count(case when ctl.transaction_type between 5 and 10 then 1 end) as resa
      FROM     circ_transaction_log ctl
               INNER JOIN patron p ON (ctl.patron_id = p.patron_id)
      AND      ctl.transaction_type <= 10  -- possibly not required if transaction_type is always <= 10 
      AND      p.college_or_school = 'High School'
      GROUP BY p.last_name;
      

      注意。未经测试,因为您没有为您的表格提供任何示例数据。

      【讨论】:

      • 非常感谢,这很好用,我实际上试图算作你已经完成了一个条件,但我忘记了合成器中的“案例”......谢谢一百万: )
      最近更新 更多