这个 SQL 应该怎么写?认真

2023-07-22 19:27:41 +08:00
 leixx
现在的版本是这样的:
名称 | 明细 | 价格
K8s | ACK | 30

现在产品想变成这个样子:
名称 | 明细| 地域 | 价格| 共有条目数
K8s | ACK | 杭州,南京 | 30 | 2

具体的数据大概是这样的:
名称 | 明细 | 地域 | 价格
K8s | ACK | 杭州| 10
K8s | ACK | 南京| 20


最好是能通过 sql 写出来,因为数据量很大。
1. 这里如何能把两个地域用 sql 写出来呢?
2. 条目数怎么计算?
3. 这只是一个产品,如果产品很多怎么办? 如何能把下面的数据,统计出来呢?
期望结果是这样的比如:
名称 | 明细 | 地域 | 价格 |共有条目数
K8s | ACK | 杭州,南京 | 30 | 2
服务器 | ECS | 杭州,上海,南京 | 30 | 5

真实数据是这样的:
名称 | 明细 | 地域| 价格
K8s | ACK | 杭州 | 10
K8s | ACK |南京 | 20
服务器 | ECS |上海 | 3.33
服务器 | ECS |上海 | 3.33
服务器 | ECS |上海 | 3.34
服务器 | ECS |杭州 | 10
服务器 | ECS |南京 | 10
2887 次点击
所在节点    程序员
28 条回复
leixx
2023-07-22 19:36:03 +08:00
现在的版本是这样的:
名称 | 明细 | 价格
K8s | ACK | 30

现在产品想变成这个样子:
名称 | 明细| 地域 | 价格| 共有条目数
K8s | ACK | 杭州,南京 | 30 | 2

具体的数据大概是这样的:
名称 | 明细 | 地域 | 价格
K8s | ACK | 杭州| 10
K8s | ACK | 南京| 20

一开始的想法就比原来多了一个地域,那就 group by 下地域,然后在到内存里面计算就好了,这样其实数据量很大,而且不能支持排序,比如是按照价格或者多个字段排序,会需要拿到最后的结果集中在排序一次。
findlisa
2023-07-22 19:39:53 +08:00
SELECT
名称,
明细,
GROUP_CONCAT(地域) AS 地域,
价格,
COUNT(*) AS 共有条目数
FROM
your_table_name -- 将表名替换为你实际的表名
GROUP BY
名称,
明细,
价格;

合并数据后,价格取值逻辑是怎么样的?
mineralsalt
2023-07-22 19:39:58 +08:00
视图是不是可以
zbinlin
2023-07-22 19:47:30 +08:00
mysql 还是 postgresql 版本?
28Sv0ngQfIE7Yloe
2023-07-22 20:14:03 +08:00
group concat 处理一下就行
Alias4ck
2023-07-22 20:28:53 +08:00
goophy
2023-07-22 20:35:23 +08:00
chatgpt 3.5

1. 为了将两个地域用 SQL 写出来,可以使用 GROUP_CONCAT 函数将地域字段进行拼接。可以如下写出 SQL:\n\n```sql\nSELECT 名称, 明细, GROUP_CONCAT(DISTINCT 地域) AS 地域, 价格\nFROM 表名\nGROUP BY 名称, 明细, 价格;\n```\n\n2. 条目数可以使用 COUNT 函数进行计算。可以如下写出 SQL:\n\n```sql\nSELECT 名称, 明细, GROUP_CONCAT(DISTINCT 地域) AS 地域, 价格, COUNT(*) AS 共有条目数\nFROM 表名\nGROUP BY 名称, 明细, 价格;\n```\n\n3. 如果产品很多,可以使用 WHERE 子句来筛选需要统计的产品。例如,筛选名称为\"K8s\"的产品,可以将 WHERE 子句加到 SQL 中:\n\n```sql\nSELECT 名称, 明细, GROUP_CONCAT(DISTINCT 地域) AS 地域, 价格, COUNT(*) AS 共有条目数\nFROM 表名\nWHERE 名称 = 'K8s'\nGROUP BY 名称, 明细, 价格;\n```\n\n4. 统计更多产品的数据,可以使用 UNION ALL 连接多个 SELECT 语句。例如,统计名称为\"K8s\"和\"服务器\"的产品,可以写出如下 SQL:\n\n```sql\nSELECT 名称, 明细, GROUP_CONCAT(DISTINCT 地域) AS 地域, 价格, COUNT(*) AS 共有条目数\nFROM 表名\nWHERE 名称 = 'K8s'\nGROUP BY 名称, 明细, 价格\nUNION ALL\nSELECT 名称, 明细, GROUP_CONCAT(DISTINCT 地域) AS 地域, 价格, COUNT(*) AS 共有条目数\nFROM 表名\nWHERE 名称 = '服务器'\nGROUP BY 名称, 明细, 价格;\n```\n\n 希望以上的 SQL 示例能够满足你的需求。请根据实际表名进行替换。
790002517zzy
2023-07-22 20:46:20 +08:00
不如问问 GPT
akira
2023-07-22 20:53:51 +08:00
2 楼的 sql 就对的了。
但是这种需求,想了半天总感觉怪怪的,数据量大? 那地域这栏就很奇怪了啊,最后拼接出一堆城市,是打算怎么展示。
leixx
2023-07-22 20:55:34 +08:00
@findlisa 🐮,太强了,sql 直接复制过来,改改名称 直接得到了想要的结果。
leixx
2023-07-22 20:56:44 +08:00
@findlisa 谢谢🙏,目前价格直接求和就好,我再去看下需求,改改应该直接可以用的。
leixx
2023-07-22 20:57:02 +08:00
@mineralsalt 好的, 没怎么用过。我去看看
leixx
2023-07-22 20:57:10 +08:00
@zbinlin mysql
leixx
2023-07-22 20:58:17 +08:00
@Alias4ck 🐮,就是这样的。感谢感谢
leixx
2023-07-22 20:59:39 +08:00
@akira 只展示前几个,多的就 [...] 代替了,加个浮窗,鼠标移动到上面,然后看到全部地域。
leixx
2023-07-22 21:00:15 +08:00
@790002517zzy 想问来着,但是组织了半天语言,还是放弃了,不知道像我这样描述,他能不能听懂。
512357301
2023-07-22 21:02:02 +08:00
看起来 op 日常不是写 SQL 的,应该是做后端开发的吧,这种需求基本上是 SQL 入门级的了。
只能说隔行如隔山,这种需求用代码实现的话,应该就得轮询或者循环查询了。
Java 、Python 、PHP 代码一般都是做点式逻辑(OLTP),SQL 批量、点式都可以😁(OLTP OLAP)
leixx
2023-07-22 21:02:24 +08:00
@goophy 厉害,直接把我的描述贴过去的吗?给了更多好的建议,谢谢提供思路,感谢。
leixx
2023-07-22 21:07:31 +08:00
@512357301 哈哈,是的,目前是后端开发, 不得不说 v2 的友友们确实很强。平常也就是 crud 。
goophy
2023-07-22 21:56:43 +08:00
@leixx #18 哈哈,直接贴过去的 :)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/958851

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX