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

这个 SQL 应该怎么写?认真

  •  
  •   leixx · 283 天前 · 2671 次点击
    这是一个创建于 283 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在的版本是这样的:
    名称 | 明细 | 价格
    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
       283 天前
    现在的版本是这样的:
    名称 | 明细 | 价格
    K8s | ACK | 30

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

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

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

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

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