【问题标题】:how to write SQL sub-query in SQL (SQLite)?如何在 SQL (SQLite) 中编写 SQL 子查询?
【发布时间】:2021-07-19 09:36:33
【问题描述】:

这是我正在寻找基于国家/地区的总买入交易价值和总卖出交易价值的示例数据。

这里有两张表,国家和行业 表[公司]:

  +-------------+--------------------+
  |         name|            country |
  +-------------+--------------------+
  |  Alice s.p. |         Wonderland |
  |      Y-zap  |         Wonderland |
  |    Absolute |          Mathlands |
  |  Arcus t.g. |          Mathlands |
  | Lil Mermaid | Underwater Kingdom |
  | None at all |        Nothingland |
  +-------------+--------------------+

表[交易]:

trades:
  +----------+-------------+------------+-------+
  |       id |      seller |      buyer | value |
  +----------+-------------+------------+-------+
  | 20121107 | Lil Mermaid | Alice s.p. |    10 |
  | 20123112 |  Arcus t.g. |      Y-zap |    30 |
  | 20120125 |  Alice s.p. | Arcus t.g. |   100 |
  | 20120216 | Lil Mermaid |   Absolute |    30 |
  | 20120217 | Lil Mermaid |   Absolute |    50 |
  +----------+-------------+------------+-------+

预期输出:

  +--------------------+--------+--------+
  |             country|  buyer |  seller|
  +--------------------+--------+--------+
  |          Mathlands |    180 |     30 |
  |        Nothingland |      0 |      0 |
  | Underwater Kingdom |      0 |     90 |
  |         Wonderland |     40 |    100 |
  +--------------------+--------+--------+

我正在尝试这个:它只给出一个值列,并且它没有显示我想要显示的 0 贸易国家。

select country, sum(value), sum(value) 
from
(select a.buyer as export, a.seller as import, value, b.country as country
from trades as a
join companies as b 
on a.seller=b.name)

group by country 
order by country

请帮忙

【问题讨论】:

  • 如果您使用的是 [postgresql] 为什么要在所有其他 RDBMS 中标记垃圾邮件..?不要标记垃圾邮件;它不能帮助我们帮助你。它不会给你的问题更多的观点。这只会让人感到困惑,因为我们不知道您真正使用的是什么技术,这意味着该问题无法回答,没有用处,因此可能会导致投票失败
  • 感谢我将其更改为 SQLite,其中查询运行良好但仍然缺少一些输出详细信息
  • “我把它改成 SQLite” 标签上写着 [postgresql] not [sqlite]...

标签: sql sqlite sum left-join


【解决方案1】:

country 加入trades 的不同行,其中仅包含买方或卖方并有条件地聚合:

SELECT c.country,
       SUM(CASE WHEN buyer IS NOT NULL THEN value ELSE 0 END) buyer,
       SUM(CASE WHEN seller IS NOT NULL THEN value ELSE 0 END) seller
FROM country c 
LEFT JOIN (
  SELECT buyer, null seller, value FROM trades
  UNION ALL
  SELECT null, seller, value FROM trades
) t ON c.name IN (t.buyer, t.seller)
GROUP BY c.country

或者,使用 SUM() 窗口函数:

SELECT DISTINCT c.country,
       SUM(CASE WHEN c.name = t.buyer THEN value ELSE 0 END) OVER (PARTITION BY c.country) buyer,
       SUM(CASE WHEN c.name = t.seller THEN value ELSE 0 END) OVER (PARTITION BY c.country) seller
FROM country c LEFT JOIN trades t
ON c.name IN (t.buyer, t.seller)

请参阅demo

【讨论】:

【解决方案2】:

试试 CTE:

WITH sold AS (
    SELECT sum(t.value) AS value, c.country FROM trades AS t INNER JOIN companies AS c ON (t.seller = c.name) GROUP BY c.country
), buyed AS (
    SELECT sum(t.value) AS value, c.country FROM trades AS t INNER JOIN companies AS c ON (t.buyer = c.name) GROUP BY c.country
)
SELECT DISTINCT c.country, COALESCE(b.value, 0) AS buyer, COALESCE(s.value, 0) AS seller
FROM companies AS c 
LEFT JOIN sold AS s ON (c.country = s.country)
LEFT JOIN buyed AS b ON (c.country = b.country)

https://www.db-fiddle.com/f/kgLezmhyiL9BKB2JUsaWYc/0

【讨论】:

  • 谢谢。它显示错误,我正在检查它。 (测试程序以退出代码 1 终止)
  • 我的回答是关于 Postgres,因为那是之前的标签。我不知道它是否适用于 SQLite,因为我不知道 SQLite。
  • 正常情况下,我调试它,但输出的想法不一样。
  • 好的,出错了。我确定了答案。
猜你喜欢
  • 2020-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多