<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>GROUP BY on 老张开工了</title>
    <link>/group-by/</link>
    <description>Recent content in GROUP BY on 老张开工了</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Fri, 07 Feb 2025 10:00:00 +0800</lastBuildDate>
    <atom:link href="/group-by/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>聚合与分组</title>
      <link>/posts/2025/02/aggregation-and-grouping/</link>
      <pubDate>Fri, 07 Feb 2025 10:00:00 +0800</pubDate>
      <guid>/posts/2025/02/aggregation-and-grouping/</guid>
      <description>聚合函数 聚合函数将多行数据汇总为单个结果，是数据分析的核心工具。&#xA;-- 创建销售数据表 CREATE TABLE sales ( id SERIAL PRIMARY KEY, product VARCHAR(100), category VARCHAR(50), amount NUMERIC(10,2), quantity INTEGER, sale_date DATE, salesperson VARCHAR(50) ); INSERT INTO sales (product, category, amount, quantity, sale_date, salesperson) VALUES (&amp;#39;笔记本电脑&amp;#39;, &amp;#39;电子产品&amp;#39;, 5999, 2, &amp;#39;2025-01-01&amp;#39;, &amp;#39;小陈&amp;#39;), (&amp;#39;手机&amp;#39;, &amp;#39;电子产品&amp;#39;, 3999, 5, &amp;#39;2025-01-02&amp;#39;, &amp;#39;小陈&amp;#39;), (&amp;#39;耳机&amp;#39;, &amp;#39;电子产品&amp;#39;, 299, 10, &amp;#39;2025-01-03&amp;#39;, &amp;#39;小李&amp;#39;), (&amp;#39;运动鞋&amp;#39;, &amp;#39;服饰&amp;#39;, 599, 3, &amp;#39;2025-01-05&amp;#39;, &amp;#39;小王&amp;#39;), (&amp;#39;T恤&amp;#39;, &amp;#39;服饰&amp;#39;, 99, 20, &amp;#39;2025-01-06&amp;#39;, &amp;#39;小陈&amp;#39;), (&amp;#39;咖啡机&amp;#39;, &amp;#39;家居&amp;#39;, 1299, 2, &amp;#39;2025-01-07&amp;#39;, &amp;#39;小李&amp;#39;), (&amp;#39;台灯&amp;#39;, &amp;#39;家居&amp;#39;, 199, 8, &amp;#39;2025-01-08&amp;#39;, &amp;#39;小王&amp;#39;), (&amp;#39;手机&amp;#39;, &amp;#39;电子产品&amp;#39;, 3999, 3, &amp;#39;2025-01-10&amp;#39;, &amp;#39;小李&amp;#39;), (&amp;#39;笔记本电脑&amp;#39;, &amp;#39;电子产品&amp;#39;, 5999, 1, &amp;#39;2025-01-12&amp;#39;, &amp;#39;小王&amp;#39;), (&amp;#39;运动鞋&amp;#39;, &amp;#39;服饰&amp;#39;, 599, 5, &amp;#39;2025-01-15&amp;#39;, &amp;#39;小陈&amp;#39;), (&amp;#39;耳机&amp;#39;, &amp;#39;电子产品&amp;#39;, 299, 15, &amp;#39;2025-01-18&amp;#39;, &amp;#39;小李&amp;#39;), (&amp;#39;台灯&amp;#39;, &amp;#39;家居&amp;#39;, 199, 12, &amp;#39;2025-01-20&amp;#39;, &amp;#39;小陈&amp;#39;), (&amp;#39;咖啡机&amp;#39;, &amp;#39;家居&amp;#39;, 1299, 1, &amp;#39;2025-01-22&amp;#39;, &amp;#39;小王&amp;#39;), (&amp;#39;T恤&amp;#39;, &amp;#39;服饰&amp;#39;, 99, 30, &amp;#39;2025-01-25&amp;#39;, &amp;#39;小李&amp;#39;), (&amp;#39;手机&amp;#39;, &amp;#39;电子产品&amp;#39;, 3999, 4, &amp;#39;2025-01-28&amp;#39;, &amp;#39;小陈&amp;#39;); 五种基础聚合 SELECT COUNT(*) AS 总记录数, COUNT(DISTINCT product) AS 不同商品数, SUM(amount) AS 总金额, AVG(amount) AS 平均金额, MAX(amount) AS 最大金额, MIN(amount) AS 最小金额 FROM sales; COUNT 的细节差异 -- COUNT(*) 统计行数（包括 NULL） SELECT COUNT(*) FROM sales; -- COUNT(column) 统计非 NULL 值的数量 SELECT COUNT(product) FROM sales; -- COUNT(DISTINCT column) 统计不重复的非 NULL 值数量 SELECT COUNT(DISTINCT product) FROM sales; -- 三者的区别 SELECT COUNT(*) AS 总行数, COUNT(salesperson) AS 非空姓名数, COUNT(DISTINCT salesperson) AS 不同姓名数 FROM sales; GROUP BY 分组聚合 -- 按产品分组 SELECT product, COUNT(*) AS 订单数, SUM(amount) AS 总销售额, SUM(quantity) AS 总销量, ROUND(AVG(amount), 2) AS 平均金额 FROM sales GROUP BY product ORDER BY 总销售额 DESC; 多维度分组 -- 按类别和产品分组（SQL 中，SELECT 的非聚合列必须出现在 GROUP BY 中） SELECT category, product, SUM(amount) AS 销售额, COUNT(*) AS 订单数 FROM sales GROUP BY category, product ORDER BY category, 销售额 DESC; PostgreSQL 允许按 SELECT 中列的序号简化：</description>
    </item>
  </channel>
</rss>
