V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
leixx
V2EX  ›  程序员

这个 SQL 应该怎么写?认真

  •  
  •   leixx · 2023-07-22 19:27:41 +08:00 · 2895 次点击
    这是一个创建于 494 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在的版本是这样的:
    名称 | 明细 | 价格
    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
    28 条回复    2023-07-23 00:55:57 +08:00
    leixx
        1
    leixx  
    OP
       2023-07-22 19:36:03 +08:00
    现在的版本是这样的:
    名称 | 明细 | 价格
    K8s | ACK | 30

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

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

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

    合并数据后,价格取值逻辑是怎么样的?
    mineralsalt
        3
    mineralsalt  
       2023-07-22 19:39:58 +08:00
    视图是不是可以
    zbinlin
        4
    zbinlin  
       2023-07-22 19:47:30 +08:00
    mysql 还是 postgresql 版本?
    28Sv0ngQfIE7Yloe
        5
    28Sv0ngQfIE7Yloe  
       2023-07-22 20:14:03 +08:00
    group concat 处理一下就行
    Alias4ck
        6
    Alias4ck  
       2023-07-22 20:28:53 +08:00
    goophy
        7
    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
        8
    790002517zzy  
       2023-07-22 20:46:20 +08:00 via Android
    不如问问 GPT
    akira
        9
    akira  
       2023-07-22 20:53:51 +08:00
    2 楼的 sql 就对的了。
    但是这种需求,想了半天总感觉怪怪的,数据量大? 那地域这栏就很奇怪了啊,最后拼接出一堆城市,是打算怎么展示。
    leixx
        10
    leixx  
    OP
       2023-07-22 20:55:34 +08:00
    @findlisa 🐮,太强了,sql 直接复制过来,改改名称 直接得到了想要的结果。
    leixx
        11
    leixx  
    OP
       2023-07-22 20:56:44 +08:00
    @findlisa 谢谢🙏,目前价格直接求和就好,我再去看下需求,改改应该直接可以用的。
    leixx
        12
    leixx  
    OP
       2023-07-22 20:57:02 +08:00
    @mineralsalt 好的, 没怎么用过。我去看看
    leixx
        13
    leixx  
    OP
       2023-07-22 20:57:10 +08:00
    @zbinlin mysql
    leixx
        14
    leixx  
    OP
       2023-07-22 20:58:17 +08:00
    @Alias4ck 🐮,就是这样的。感谢感谢
    leixx
        15
    leixx  
    OP
       2023-07-22 20:59:39 +08:00
    @akira 只展示前几个,多的就 [...] 代替了,加个浮窗,鼠标移动到上面,然后看到全部地域。
    leixx
        16
    leixx  
    OP
       2023-07-22 21:00:15 +08:00
    @790002517zzy 想问来着,但是组织了半天语言,还是放弃了,不知道像我这样描述,他能不能听懂。
    512357301
        17
    512357301  
       2023-07-22 21:02:02 +08:00 via Android
    看起来 op 日常不是写 SQL 的,应该是做后端开发的吧,这种需求基本上是 SQL 入门级的了。
    只能说隔行如隔山,这种需求用代码实现的话,应该就得轮询或者循环查询了。
    Java 、Python 、PHP 代码一般都是做点式逻辑(OLTP),SQL 批量、点式都可以😁(OLTP OLAP)
    leixx
        18
    leixx  
    OP
       2023-07-22 21:02:24 +08:00
    @goophy 厉害,直接把我的描述贴过去的吗?给了更多好的建议,谢谢提供思路,感谢。
    leixx
        19
    leixx  
    OP
       2023-07-22 21:07:31 +08:00
    @512357301 哈哈,是的,目前是后端开发, 不得不说 v2 的友友们确实很强。平常也就是 crud 。
    goophy
        20
    goophy  
       2023-07-22 21:56:43 +08:00
    @leixx #18 哈哈,直接贴过去的 :)
    bingfengfeifei
        21
    bingfengfeifei  
       2023-07-22 21:57:14 +08:00
    Clickhouse 的话
    select 名称,明细, groupUniqArray(地域), sum(价格), count() as count
    from table_name
    group by 名称,明细
    dys0327
        22
    dys0327  
       2023-07-22 23:08:26 +08:00
    @findlisa #2 大佬,本人小白,问个问题哈,看他上面的需求我理解的是根据名称和明细合并地域、合计价格、统计条数,为什么 group by 要加上价格,不应该直接在 select 后面 sum(价格)吗?
    isnullstring
        23
    isnullstring  
       2023-07-22 23:16:27 +08:00
    没怎么写过 SQL ?这也太简单了吧.....
    我主要用 sqlserver ,所以思路上来就是 按名称和明细 字段 group ,然后 distince 开窗函数 做地域 字段,sum 做价格,count 做条目数
    调用两个脑细胞完事
    如果数据量上百万的话,那还是用程序来做吧
    leonhao
        24
    leonhao  
       2023-07-22 23:33:41 +08:00
    @isnullstring 数据量大才应该用 sql
    findlisa
        25
    findlisa  
       2023-07-22 23:43:54 +08:00
    @dys0327 你说的没错我也想这样写,但是我觉得产品的单价合并貌似逻辑有问题,所以后面问了一下楼主
    790002517zzy
        26
    790002517zzy  
       2023-07-22 23:56:14 +08:00 via Android
    @leixx 只要你会描述 GPT 就会写
    isnullstring
        27
    isnullstring  
       2023-07-23 00:29:07 +08:00
    @leonhao #24 这种简单的无所谓,复杂一点,SQL 不好写
    documentzhangx66
        28
    documentzhangx66  
       2023-07-23 00:55:57 +08:00
    别总想着一条 SQL 做完复杂计算,真的是被毒教材给坑害了。

    临时表,游标,分布计算,很难吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1066 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 19:46 · PVG 03:46 · LAX 11:46 · JFK 14:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.