您的位置:首页 > 科技 > IT业 > 营销网站定制的优势_大学生网页制作_seo实战培训教程_百度在线提问

营销网站定制的优势_大学生网页制作_seo实战培训教程_百度在线提问

2025/1/15 17:18:29 来源:https://blog.csdn.net/weixin_45862390/article/details/144404700  浏览:    关键词:营销网站定制的优势_大学生网页制作_seo实战培训教程_百度在线提问
营销网站定制的优势_大学生网页制作_seo实战培训教程_百度在线提问

文章目录

  • 一. 数据介绍
  • 二. 数据汇总
    • 1. 详细报告
      • 练习6
      • 练习7
    • 2. 带时间限制得报表
      • 练习8
    • 3. 计算多个对象
      • 练习9
    • 4. 总订单金额
      • 练习10
    • 5. 计算多个订单的订单金额
      • 练习11
    • 6. 不同类别商品的库存
    • 7. Group by分组
      • 练习12
    • 8. 选择显示部分信息
      • 练习13
    • 9. COUNT()函数回顾
      • 练习14
  • 三. 使用CASE WHEN 和 GROUP BY将数据分组
  • 四. 窗口函数

一. 数据介绍

二. 数据汇总

掌握GROUP BY 分组和 COUNT SUM等聚合函数的使用

1. 详细报告

  • 我们经常会遇到这样的数据需求: 将一个或者多个业务对象的详细信息汇总到一张表中

  • 通常我们需要的信息会分别在多张表中记录,此时通过

    SQL的一个或者多个`JOIN`子句可以将信息进行汇总
    SELECTc.company_name AS customer_company_name, e.first_name AS employee_first_name, e.last_name AS employee_last_name,o.order_date,o.shipped_date,o.ship_country
    FROM orders o
    JOIN employees eON o.employee_id = e.employee_id
    JOIN customers cON o.customer_id = c.customer_id
    WHERE o.ship_country = 'France';
    
  • 在上面的SQL查询中,我们想收集运输到法国的订单的相关信息,包括订单涉及的顾客和员工信息,下单和发货日期等

  • 由于相关数据保存在不同的表中,所以需要将orders 表, employees 表和 customers 表连接在一起

  • 注意在写SQL时,我们可以为每一张表都起了一个别名,可以减少输入的字符数

练习6

  • 需求:提供订单编号为10248的相关信息,包括product name, unit price (在 order_items 表中), quantity(数量),company_name(供应商公司名字 ,起别名 supplier_name).

    SELECTproduct_name,oi.unit_price,oi.quantity,company_name AS supplier_name
    FROM order_items oi
    JOIN products p ON oi.product_id = p.product_id
    JOIN suppliers sON s.supplier_id = p.supplier_id
    WHERE oi.order_id = 10248;
    
    product_nameunit_pricequantitysupplier_name
    Queso Cabrales14.0012Cooperativa de Quesos ‘Las Cabras’
    Singaporean Hokkien Fried Mee9.8010Leka Trading
    Mozzarella di Giovanni34.805Formaggi Fortini s.r.l.

练习7

  • 需求:提取每件商品的详细信息,包括 商品名称(product_name), 供应商的公司名称 (company_name,在 suppliers 表中), 类别名称 category_name, 商品单价unit_price, 和每单位商品数量quantity per unit
SELECT p.product_name,s.company_name,c.category_name,p.unit_price,p.quantity_per_unit
FROM products p
JOIN suppliers sON p.supplier_id = s.supplier_id
JOIN categories cON c.category_id = p.category_id;

2. 带时间限制得报表

  • 另一种常见的报表需求是查询某段时间内的业务指标

    SELECTCOUNT(*)
    FROM orders
    WHERE order_date >= '2016-07-01' AND  order_date < '2016-08-01';
    
  • 在上面的查询中,我们统计了2016年7月的订单数量,

  • 需要注意SQL中的日期总是放在单引号内,格式通常为“ YYYY-MM-DD”(年-月-日)

练习8

  • 统计2013年入职的员工数量,统计字段起别名 number_of_employees

    SELECTCOUNT(*) AS number_of_employees
    FROM employees
    WHERE hire_date >= '2013-01-01' AND hire_date < '2014-01-01';
    
    number_of_employees
    3

3. 计算多个对象

  • 在业务报表中,我们通常希望同时计算多个业务对象的某些指标。

    SELECTo.order_id,COUNT(*) AS order_items_count
    FROM orders o
    JOIN order_items oiON o.order_id = oi.order_id
    WHERE o.order_id BETWEEN 10200 AND 10300
    GROUP BY o.order_id;
    
  • 在上面的查询中,我们统计了指定范围内的order_id,计算每个订单中的商品数量

    • 通过连接ordersorder_items表,在同一行显示单个订单商品及其父订单的信息
    • 按照父顺序对所有行进行分组
    • 使用COUNT(*)统计每个订单的商品数量

练习9

  • 需求:统计每个供应商供应的商品种类数量

    • 结果返回供应商IDsupplier_id ,公司名字company_name ,商品种类数量(起别名products_count )
    • 使用 productssuppliers 表.
    SELECTs.supplier_id,company_name,COUNT(*) AS products_count
    FROM products p
    JOIN suppliers sON p.supplier_id = s.supplier_id 
    GROUP BY s.supplier_id,company_name;
    

    MySQL 5.7之后要求,在使用GROUP BY分组时,SELECT 后的字段,如果没有在聚合函数中使用,就必须在GROUP BY 后出现

    supplier_idcompany_nameproducts_count
    1Exotic Liquids3
    4Tokyo Traders3
    5Cooperativa de Quesos ‘Las Cabras’2
    6Mayumi’s3
    7Pavlova, Ltd.5
    8Specialty Biscuits, Ltd.4
    9PB Knäckebröd AB2
    10Refrescos Americanas LTDA1
    11Heli Süßwaren GmbH & Co. KG3
    12Plutzer Lebensmittelgroßmärkte AG5
    13Nord-Ost-Fisch Handelsgesellschaft mbH1
    14Formaggi Fortini s.r.l.3
    16Bigfoot Breweries6
    17Svensk Sjöföda AB3
    18Aux joyeux ecclésiastiques2
    2New Orleans Cajun Delights4
    19New England Seafood Cannery2
    20Leka Trading3
    21Lyngbysild2
    22Zaanse Snoepfabriek2
    23Karkki Oy3
    24G’day, Mate3
    25Ma Maison2
    26Pasta Buttini s.r.l.2
    27Escargots Nouveaux1
    28Gai pâturage2
    3Grandma Kelly’s Homestead3
    29Forêts d’érables2

4. 总订单金额

  • 在销售报表中,我们经常需要计算订单的总付款额。

    SELECTSUM(unit_price * quantity) AS total_price
    FROM orders o
    JOIN order_items oiON o.order_id = oi.order_id
    WHERE o.order_id = 10250;
    
  • 我们要查找ID为10250的订单的总价(折扣前),SUM(unit_price * quantity)

练习10

  • Northwind商店某些产品会不定期做打折促销

  • 每个商品的折扣都存储在 order_items 表的discount 列中

  • 例如,“ 0.20”折扣意味着客户支付原始价格的“ 1-0.2 = 0.8”

  • 在下面的代码中添加第二个名为total_price_after_discount的列,计算打折后的商品价格

    SELECTSUM(unit_price * quantity) AS total_price
    FROM orders o
    JOIN order_items oi ON o.order_id = oi.order_id
    WHERE o.order_id = 10250;
    

    答案

    SELECT SUM(unit_price * quantity) AS total_price, SUM(unit_price * quantity * (1 - discount)) AS total_price_after_discount
    FROM orders o
    JOIN order_items oiON o.order_id = oi.order_id
    WHERE o.order_id = 10250;
    
    total_pricetotal_price_after_discount
    18131552.6

5. 计算多个订单的订单金额

  • 上面的案例中我们计算了单个订单的订单总金额,接下来我们统计多个订单的总金额
SELECTo.order_id,c.company_name AS customer_company_name, SUM(unit_price * quantity) AS total_price
FROM orders o
JOIN customers cON o.customer_id = c.customer_id
JOIN order_items oiON o.order_id = oi.order_id
WHERE o.ship_country = 'France'
GROUP BY o.order_id, c.company_name;
  • 我们想计算运输到法国的所有订单的总订单金额
  • 在结果中,我们想保留订单ID和订单公司名字,可以通过GROUP BY 实现
  • 注意:通过GROUP BY 我们只需要对 order_id 进行分组就可以了,但MySQL 5.7之后要求,在使用GROUP BY分组时,SELECT 后的字段,如果没有在聚合函数中使用,就必须在GROUP BY 后出现

练习11

  • 统计每个员工处理的订单总数

  • 结果包含员工IDemployee_id,姓名first_namelast_name,处理的订单总数(别名 orders_count)

    SELECTe.employee_id,e.first_name,e.last_name,COUNT(*) AS orders_count
    FROM orders o
    JOIN employees eON e.employee_id = o.employee_id
    GROUP BY e.employee_id,e.first_name,e.last_name;
    
    employee_idfirst_namelast_nameorders_count
    5StevenBuchanan42
    6MichaelSuyama67
    4MargaretPeacock156
    3JohnSmith127
    9AnneDodsworth43
    1NancyDavolio123
    8LauraCallahan104
    2AndrewFuller96
    7RobertKing72

6. 不同类别商品的库存

  • 统计每个类别中的库存产品值多少钱?
    • 显示三列:category_id, category_name, 和 category_total_price

    • 如何计算库存商品总价:SUM(unit_price * units_in_stock)

      SELECTc.category_id,c.category_name,SUM(unit_price * units_in_stock) AS category_total_price
      FROM products p
      JOIN categories cON p.category_id = c.category_id
      GROUP BY c.category_id,c.category_name;
      
      category_idcategory_namecategory_total_price
      5Grains/Cereals5594.50
      4Dairy Products11271.20
      6Meat/Poultry5729.45
      2Condiments12023.55
      7Produce3549.35
      1Beverages12480.25
      8Seafood13010.35
      3Confections10392.20

7. Group by分组

  • 接下来,我们来了解每个员工的业绩:计算每个员工的订单数量

  • 看下面的SQL是否有问题

    SELECTe.first_name,e.last_name,COUNT(*) AS orders_count
    FROM orders o
    JOIN employees eON o.employee_id = e.employee_id
    GROUP BY e.first_name,e.last_name;
    
  • 上面的SQL貌似正确,但是没有考虑到员工重名的问题,所以需要做一个小调整:

    SELECTe.employee_id,e.first_name,e.last_name,COUNT(*) AS orders_count
    FROM orders o
    JOIN employees eON o.employee_id = e.employee_id
    GROUP BY e.employee_id,e.first_name,e.last_name;
    
  • SELECTGROUP BY 中添加了 员工ID employee_id字段后,重名的问题就可以解决了

  • 注意,在使用GROUP BY进行分组聚合统计时,需要考虑分组字段中的相同值的业务含义是否相同

练习12

  • 需求:计算每个客户的下订单数

  • 结果包含:用户id、用户公司名称、订单数量(customer_id, company_name, orders_count

    SELECTc.customer_id,c.company_name,COUNT(*) AS orders_count
    FROM orders o
    JOIN customers cON o.customer_id = c.customer_id
    GROUP BY c.customer_id,c.company_name;
    
    customer_idcompany_nameorders_count
    VINETVins et alcools Chevalier5
    TOMSPToms Spezialitäten6
    HANARHanari Carnes14
    VICTEVictuailles en stock10
    SUPRDSuprêmes délices12
    CHOPSChop-suey Chinese8
    RICSURichter Supermarkt10
    WELLIWellington Importadora9
    HILAAHILARION-Abastos18
    ERNSHErnst Handel30
    CENTCCentro comercial Moctezuma1
    OTTIKOttilies Käseladen10
    QUEDEQue Delícia9
    RATTCRattlesnake Canyon Grocery18
    FOLKOFolk och fä HB19
    BLONPBlondesddsl père et fils11
    WARTHWartian Herkku15
    FRANKFrankenversand15
    GROSRGROSELLA-Restaurante2
    WHITCWhite Clover Markets14
    SPLIRSplit Rail Beer & Ale9
    QUICKQUICK-Stop28
    MAGAAMagazzini Alimentari Riuniti10
    TORTUTortuga Restaurante10
    MORGKMorgenstern Gesundkost5
    BERGSBerglunds snabbköp18
    LEHMSLehmanns Marktstand15
    ROMEYRomero y tomillo5
    LILASLILA-Supermercado14
    RICARRicardo Adocicados11
    REGGCReggiani Caseifici12
    BSBEVB’s Beverages10
    COMMIComércio Mineiro5
    TRADHTradição Hipermercados6
    HUNGOHungry Owl All-Night Grocers19
    WANDKDie Wandernde Kuh10
    GODOSGodos Cocina Típica10
    OLDWOOld World Delicatessen10
    LONEPLonesome Pine Restaurant8
    ANATRAna Trujillo Emparedados y helados4
    THEBIThe Big Cheese4
    ISLATIsland Trading10
    PERICPericles Comidas clásicas6
    KOENEKöniglich Essen14
    SAVEASave-a-lot Markets31
    BOLIDBólido Comidas preparadas3
    FURIBFuria Bacalhau e Frutos do Mar8
    BONAPBon app’17
    MEREPMère Paillarde13
    PRINIPrincesa Isabel Vinhos5
    SIMOBSimons bistro7
    FAMIAFamilia Arquibaldo7
    LAMAILa maison d’Asie14
    PICCOPiccolo und mehr10
    AROUTAround the Horn13
    SEVESSeven Seas Imports9
    DRACDDrachenblut Delikatessen6
    EASTCEastern Connection8
    GALEDGalería del gastrónomo5
    VAFFEVaffeljernet11
    WOLZAWolski Zajazd7
    HUNGCHungry Coyote Import Store5
    SANTGSanté Gourmet6
    BOTTMBottom-Dollar Markets14
    LINODLINO-Delicateses12
    FOLIGFolies gourmandes5
    FRANSFranchi S.p.A.6
    GOURLGourmet Lanchonetes9
    CONSHConsolidated Holdings3
    RANCHRancho grande5
    LAZYKLazy K Kountry Store2
    LAUGBLaughing Bacchus Wine Cellars3
    BLAUSBlauer See Delikatessen7
    NORTSNorth/South3
    CACTUCactus Comidas para llevar6
    GREALGreat Lakes Food Market11
    MAISDMaison Dewey7
    TRAIHTrail’s Head Gourmet Provisioners3
    LETSSLet’s Stop N Shop4
    WILMKWilman Kala7
    THECRThe Cracker Box3
    ALFKIAlfreds Futterkiste6
    FRANRFrance restauration3
    SPECDSpécialités du monde4
    LACORLa corne d’abondance4

8. 选择显示部分信息

  • 再看一下上面的例子

    SELECTe.employee_id,e.first_name,e.last_name,COUNT(*) AS orders_count
    FROM orders o
    JOIN employees eON o.employee_id = e.employee_id
    GROUP BY e.employee_id,e.first_name,e.last_name;
    
  • 我们通过 employee_id进行分组, 但是GROUP BY中的字段,不一定在SELECT中出现,例如下面的SQL:

    SELECTe.first_name,e.last_name,COUNT(*) AS orders_count
    FROM orders o
    JOIN employees eON o.employee_id = e.employee_id
    GROUP BY e.employee_id,e.first_name,e.last_name;
    
  • 之前我们强调过,SELECT 中的字段,如果没在聚合函数中使用,就一定更要在GROUP BY 子句中出现

  • 但是,GROUPY BY子句中的字段,可以不用都出现在SELECT

练习13

  • 需求:统计2016年6月到2016年7月用户的总下单金额并按金额从高到低排序
  • 结果包含:顾客公司名称company_name 和总下单金额(折后实付金额)total_paid
  • 提示:
    • 计算实际总付款金额: SUM(unit_price * quantity * (1 - discount))

    • 日期过滤 WHERE order_date >= '2016-06-01' AND order_date < '2016-08-01'

      SELECTc.company_name, SUM(unit_price * quantity * (1 - discount)) AS total_paid
      FROM orders o
      JOIN order_items oiON o.order_id = oi.order_id
      JOIN customers cON o.customer_id = c.customer_id
      WHERE order_date >= '2016-06-01' AND order_date < '2016-08-01'
      GROUP BY c.customer_id,c.company_name
      ORDER BY total_paid DESC;
      
      company_nametotal_paid
      Suprêmes délices3597.9
      Frankenversand3536.6
      Ernst Handel3488.68
      Hanari Carnes2997.4
      Richter Supermarkt2490.5
      Toms Spezialitäten1863.4
      Ottilies Käseladen1504.65
      Blondesddsl père et fils1176
      HILARION-Abastos1119.9
      GROSELLA-Restaurante1101.2
      Folk och fä HB695.62
      Victuailles en stock654.06
      White Clover Markets642.2
      Rattlesnake Canyon Grocery584
      Chop-suey Chinese556.62
      Wellington Importadora517.8
      Que Delícia448
      Vins et alcools Chevalier440
      Wartian Herkku346.56
      Centro comercial Moctezuma100.8

9. COUNT()函数回顾

  • 当创建业务报表的时候,需要注意 COUNT(*)COUNT(列名) 之间的区别

  • 假设我们要统计发货到不同国家/地区的订单数量以及已经发货的订单数量

    SELECTship_country,COUNT(*) AS all_orders,COUNT(shipped_date) AS shipped_orders
    FROM orders
    GROUP BY ship_country;
    
  • COUNT(*)将计算ship_country中的所有订单

  • COUNT(shipped_date)将仅计算shipped_date列值不为NULL的行

  • 在我们的数据库中, shipped_date 列中的NULL表示尚未发货,COUNT(shipped_date)` 仅计算已经发货的订单。

练习14

  • 需求:统计客户总数和带有传真号码的客户数量

  • 需要字段:all_customers_countcustomers_with_fax_count

    SELECTCOUNT(*) AS all_customers_count, COUNT(fax) AS customers_with_fax_count
    FROM customers;
    
    all_customers_countcustomers_with_fax_count
    9169

三. 使用CASE WHEN 和 GROUP BY将数据分组

四. 窗口函数

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com