【问题标题】:nested union select statement嵌套联合选择语句
【发布时间】:2016-01-12 19:41:34
【问题描述】:

是否可以在不创建临时表的情况下对我的 sql SELECT 语句的结果进行分组以在一个语句中求和和分组?我有一个表格,其中保存了贷方帐号和借方帐号的借方和贷方金额的总和。 并为相反的字段输入零,我使用下面的联合选择语句创建了第一个 grouppage,我需要根据重复的帐户名称对输出求和 我可以很容易地得到这个还是必须加载它的临时表?我的选择语句如下

select  journal_drname  AS ACCNAME, sum(amount) AS DEBT,0 as CREDIT
FROM JOURNAL GROUP BY journal_drname 
 UNION select  journal_crname  AS ACCNAME, 0 as DEBT,sum(amount) AS   
 CREDIT,
 FROM JOURNAL GROUP BY journal_crname

返回数据如:

ACCNAME      DEBIT     CREDIT
--------   -------     ------
CASH        0           1,000
CASH        900          0
CASH        300          0
BANK        200          0
BANK        400          0

我可以总结一下上面的分组如下:

ACCNAME      DEBIT     CREDIT
--------   -------     ------
CASH        200          0
BANK        600          0

并且我想加入这些被削减的结果。

我试图避免使用临时表,但如果这是唯一可行的方法,我想了解更多关于以这种方式使用临时表的信息。

我也尝试过某种形式的加入和联合,但不满足条件,我也不知道该怎么做。

【问题讨论】:

  • 除非journal_drname 中包含不寻常的字符,否则您的结果没有意义。
  • 改写:为什么现金和银行的每个账户名的贷方和借方值都为 0?您提出的 SQL 否定了这种可能性。
  • 是的,在这种情况下,我必须将帐户名加载到 journal_crname 中,如果相同的帐户名出现在借方中,我必须将其加载到 journal_crname 字段中,所以我有两个案例用于帐户名在外国帐户名称 journal_drname 和 journal_crname 上有两列加载

标签: mysql sql derby javadb


【解决方案1】:

正如您所说,您的查询正在运行,让我们将您的联合查询称为表

( ...... ) myTable

然后只需创建一个子查询即可完成最后一步

SELECT ACCNAME,
       CASE WHEN SUM(CREDIT - DEBT) < 0 THEN - SUM(CREDIT - DEBT)
            ELSE 0
       END DEBT,
       CASE WHEN SUM(CREDIT - DEBT) > 0 THEN   SUM(CREDIT - DEBT)
            ELSE 0
       END CREDIT
FROM ( ...... ) myTable
GROUP BY ACCNAME

【讨论】:

  • 该语句看起来很完美,但仍然给我错误消息不接受最后一行“GROUP BY ACCNAME”我将继续检查并恢复 thxs
  • 是的,现在工作得很好,非常感谢先生
  • 是的,我错过了将内部表别名 myTable 这就是为什么。Thxs
【解决方案2】:

如果您希望每个子查询只有一行,则删除 group by:

select  'CASH' as ACCNAME, sum(amount) AS DEBT, 0 as CREDIT
FROM JOURNAL 
UNION ALL
select  'BANK' as ACCNAME, 0 as DEBT, sum(amount) AS  CREDIT
FROM JOURNAL;

(注意:ACCNAME 的值可能会颠倒。)

重要提示:对于此类查询,您应该使用 UNION ALL 而不是 UNION。除非您打算删除重复项,否则没有理由产生删除重复项的开销。

此外,您的原始查询应该有效,除非 accname 字段中有不寻常的字符。

【讨论】:

  • 我喜欢它......但我对“,除非你打算删除重复项”感到困惑根据定义,不能有重复项。基于SQL。 CASH 和 BANK 从联合中否定重复,并且在内部由于每个只有一行,所以不能有重复。也许您需要在 union 的每个部分中为 journal_drname 提供 where 子句,一个用于银行,一个用于现金。
  • @xQbert 。 . . UNION 总是会产生删除重复项的开销,即使没有重复项(我说“总是”;但我想某处的某些数据库可能会识别出一些使重复项消除短路的特殊情况)。
【解决方案3】:

怎么样:

select ACCNAME, 
    CASE WHEN sum(DEBT)>sum(CREDIT) THEN sum(DEBT)-sum(CREDIT) ELSE 0 AS DEBT, 
    CASE WHEN sum(DEBT)<sum(CREDIT) THEN sum(CREDIT)-sum(DEBT) ELSE 0 AS CREDIT 
FROM (
    select  journal_drname  AS ACCNAME, 
        sum(amount) AS DEBT,
        0 as CREDIT
    FROM JOURNAL GROUP BY journal_drname 
UNION 
    select journal_crname  AS ACCNAME, 
        0 as DEBT,
        sum(amount) AS CREDIT,
 FROM JOURNAL GROUP BY journal_crname
) group by ACCNAME

【讨论】:

  • 我相信 mySql 子查询必须有一个别名才能工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-15
  • 2021-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
相关资源
最近更新 更多