我们使用一个名为"Products"的表,包含以下列:ProductID、ProductName、CategoryID、UnitPrice、StockQuantity。
-- 建表 CREATE TABLE `products` ( `productID` int(11) NOT NULL, `productName` varchar(255) DEFAULT NULL, `categoryID` int(11) DEFAULT NULL, `unitPrice` int(11) DEFAULT NULL, `stockQuantity` int(11) DEFAULT NULL, PRIMARY KEY (`productID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 样例数据 INSERT INTO `products` VALUES (1, 'Laptop', 1, 800, 50); INSERT INTO `products` VALUES (2, 'Smartphone', 1, 500, 100); INSERT INTO `products` VALUES (3, 'T-shirt', 2, 20, 200); INSERT INTO `products` VALUES (4, 'Jeans', 2, 40, 150); INSERT INTO `products` VALUES (5, 'Headphones', 1, 100, 75);
productID | productName | categoryID | unitPrice | stockQuantity |
---|---|---|---|---|
1 | Laptop | 1 | 800 | 50 |
2 | Smartphone | 1 | 500 | 100 |
3 | T-shirt | 2 | 20 | 200 |
4 | Jeans | 2 | 40 | 150 |
5 | Headphones | 1 | 100 | 75 |
SELECT ProductName, UnitPrice, CASE WHEN UnitPrice > 100 THEN 'Expensive' ELSE 'Affordable' END AS PriceCategory FROM Products;
查询结果:
ProductName | UnitPrice | PriceCategory |
---|---|---|
Laptop | 800 | Expensive |
Smartphone | 500 | Expensive |
T-shirt | 20 | Affordable |
Jeans | 40 | Affordable |
Headphones | 100 | Affordable |
SELECT productName, stockQuantity, CASE WHEN stockQuantity > 100 THEN 'In Stock' WHEN stockQuantity > 50 THEN 'Limited Stock' ELSE 'Out of Stock' END AS StockStatus FROM products;
查询结果:
productName | stockQuantity | StockStatus |
---|---|---|
Laptop | 50 | Out of Stock |
Smartphone | 100 | Limited Stock |
T-shirt | 200 | In Stock |
Jeans | 150 | In Stock |
Headphones | 75 | Limited Stock |
SELECT categoryID, AVG( unitPrice ) AS AvgPrice, CASE WHEN AVG( unitPrice ) > 50 THEN 'High Price' ELSE 'Low Price' END AS PriceCategory FROM products GROUP BY categoryID;
categoryID | AvgPrice | PriceCategory |
---|---|---|
1 | 466.6667 | Hign Price |
2 | 30 | low Price |
SELECT productName, CASE WHEN EXTRACT( MONTH FROM CURRENT_DATE ) = 8 THEN ( SELECT NOW() ) ELSE 'Other Month' END AS CurrentTime FROM products;
productName | CurrentTime |
---|---|
Laptop | 2023/8/30 19:14 |
Smartphone | 2023/8/30 19:14 |
T-shirt | 2023/8/30 19:14 |
Jeans | 2023/8/30 19:14 |
Headphones | 2023/8/30 19:14 |
SELECT ProductName, UnitPrice, CASE WHEN UnitPrice > 50 THEN 'Expensive' ELSE 'Affordable' END AS PriceCategory FROM Products ORDER BY UnitPrice DESC;
productName | unitPrice | PriceCategory |
---|---|---|
Laptop | 1902/3/10 0:00 | Expensive |
Smartphone | 1901/5/14 0:00 | Expensive |
Headphones | 1900/4/9 0:00 | Expensive |
Jeans | 1900/2/9 0:00 | Affordable |
T-shirt | 1900/1/20 0:00 | Affordable |
SELECT productName, unitPrice, ( CASE WHEN unitPrice > ( SELECT AVG( unitPrice ) FROM products ) THEN 'Above Avg' ELSE 'Below Avg' END ) AS PriceComparison FROM products;
productName | unitPrice | PriceComparison |
---|---|---|
Laptop | 800 | Above Avg |
Smartphone | 500 | Above Avg |
T-shirt | 20 | Below Avg |
Jeans | 40 | Below Avg |
Headphones | 100 | Below Avg |
SELECT ProductName, UnitPrice, StockQuantity, CASE WHEN StockQuantity > 0 THEN UnitPrice / StockQuantity ELSE 0 END AS PricePerUnit FROM Products;
productName | unitPrice | stockQuantity | PricePerUnit |
---|---|---|---|
Laptop | 800 | 50 | 16 |
Smartphone | 500 | 100 | 5 |
T-shirt | 20 | 200 | 0.1 |
Jeans | 40 | 150 | 0.2667 |
Headphones | 100 | 75 | 1.3333 |
SELECT productName, unitPrice, stockQuantity, CASE WHEN stockQuantity > 150 THEN 'High' WHEN stockQuantity > 100 THEN 'Medium' ELSE 'Low' END AS StockCategory, CASE WHEN stockQuantity > 100 THEN stockQuantity * 1.1 ELSE stockQuantity * 1.05 END AS AdjustedStock FROM products;
productName | unitPrice | stockQuantity | StockCategory | AdjustedStock |
---|---|---|---|---|
Laptop | 800 | 50 | Low | 52.5 |
Smartphone | 500 | 100 | Low | 105 |
T-shirt | 20 | 200 | High | 220 |
Jeans | 40 | 150 | Medium | 165 |
Headphones | 100 | 75 | Low | 78.75 |
SELECT ProductName, UnitPrice, CASE WHEN StockQuantity > 100 THEN CASE WHEN UnitPrice > 50 THEN 'High Demand, High Price' ELSE 'High Demand, Affordable' END ELSE 'Low Demand' END AS ProductStatus FROM Products;
productName | unitPrice | ProductStatus |
---|---|---|
Laptop | 800 | Low Demand |
Smartphone | 500 | Low Demand |
T-shirt | 20 | High Demand, Affordable |
Jeans | 40 | High Demand, Affordable |
Headphones | 100 | Low Demand |
SELECT ProductName, CASE WHEN ProductName LIKE '%Laptop%' THEN 'Electronics' WHEN ProductName LIKE '%T-shirt%' THEN 'Clothing' ELSE 'Other' END AS Category FROM Products;
productName | Category |
---|---|
Laptop | Electronics |
Smartphone | Other |
T-shirt | Clothing |
Jeans | Other |
Headphones | Other |
SELECT ProductName, UnitPrice, CASE WHEN UnitPrice > 50 AND StockQuantity > 50 THEN 'High Price, High Stock' WHEN UnitPrice > 50 OR StockQuantity > 50 THEN 'High Price or High Stock' ELSE 'Low Price and Low Stock' END AS ProductStatus FROM Products;
productName | unitPrice | ProductStatus |
---|---|---|
Laptop | 800 | High Price or High Stock |
Smartphone | 500 | High Price, High Stock |
T-shirt | 20 | High Price or High Stock |
Jeans | 40 | High Price or High Stock |
Headphones | 100 | High Price, High Stock |
SELECT ProductName, UnitPrice, StockQuantity, CASE WHEN StockQuantity > 50 AND UnitPrice < 30 THEN 'Popular and Affordable' WHEN StockQuantity <= 50 AND UnitPrice < 30 THEN 'Limited Stock, Affordable' WHEN StockQuantity > 50 AND UnitPrice >= 30 THEN 'Popular and Expensive' ELSE 'Limited Stock, Expensive' END AS ProductCategory FROM Products;
productName | unitPrice | stockQuantity | ProductCategory |
---|---|---|---|
Laptop | 800 | 50 | Limited Stock, Expensive |
Smartphone | 500 | 100 | Popular and Expensive |
T-shirt | 20 | 200 | Popular and Affordable |
Jeans | 40 | 150 | Popular and Expensive |
Headphones | 100 | 75 | Popular and Expensive |
SELECT ProductName, UnitPrice, StockQuantity, CASE WHEN StockQuantity > AVG(StockQuantity) OVER () THEN 'Above Avg Stock' ELSE 'Below Avg Stock' END AS StockComparison FROM Products;
productName | unitPrice | stockQuantity | StockComparison |
---|---|---|---|
T-shirt | 20 | 200 | Above Avg Stock |
Laptop | 800 | 50 | Below Avg Stock |
Jeans | 40 | 150 | Above Avg Stock |
Smartphone | 500 | 100 | Below Avg Stock |
Headphones | 100 | 75 | Below Avg Stock |
样例SQL:
SELECT p.ProductID, p.ProductName, s.SaleDate, s.QuantitySold, CASE WHEN s.QuantitySold > LAG(s.QuantitySold) OVER (PARTITION BY p.ProductID ORDER BY s.SaleDate) THEN 'Increased' WHEN s.QuantitySold < LAG(s.QuantitySold) OVER (PARTITION BY p.ProductID ORDER BY s.SaleDate) THEN 'Decreased' ELSE 'Stable' END AS Trend FROM Products p JOIN SalesHistory s ON p.ProductID = s.ProductID;
样例SQL:
SELECT o.OrderID, o.OrderDate, SUM(CASE WHEN p.CategoryID = 1 THEN o.Quantity ELSE 0 END) AS ElectronicsQuantity, SUM(CASE WHEN p.CategoryID = 2 THEN o.Quantity ELSE 0 END) AS ClothingQuantity, SUM(CASE WHEN p.CategoryID = 3 THEN o.Quantity ELSE 0 END) AS OtherQuantity FROM Orders o JOIN Products p ON o.ProductID = p.ProductID GROUP BY o.OrderID, o.OrderDate;
样例SQL:
SELECT EmployeeID, FirstName, LastName, Salary, CASE WHEN Salary > 70000 THEN 'High' WHEN Salary > 60000 THEN 'Medium' WHEN Salary > 50000 THEN 'Low' ELSE 'Very Low' END AS SalaryLevel, CASE WHEN Salary > 60000 THEN 'Above Average' ELSE 'Below Average' END AS SalaryComparison FROM Employees;
样例SQL:
SELECT CustomerID, Age, Gender, CASE WHEN Age < 30 THEN 'Young' WHEN Age >= 30 AND Age < 40 THEN 'Middle-aged' ELSE 'Senior' END AS AgeGroup, CASE WHEN Gender = 'Male' THEN 'Male' WHEN Gender = 'Female' THEN 'Female' ELSE 'Other' END AS GenderCategory FROM Customers;
样例SQL:
SELECT OrderID, OrderDate, SUM(CASE WHEN Quantity * Price > 500 THEN Quantity ELSE 0 END) AS HighValueItems, SUM(CASE WHEN Quantity * Price > 100 AND Quantity * Price <= 500 THEN Quantity ELSE 0 END) AS MediumValueItems, SUM(CASE WHEN Quantity * Price <= 100 THEN Quantity ELSE 0 END) AS LowValueItems FROM Orders GROUP BY OrderID, OrderDate;
您可以使用CASE WHEN来对现有数据进行重新编码,例如将文本值转换为数字编码或将某些字符串转换为更易于处理的标识符。
SELECT customerName, CASE WHEN customerType = 'Individual' THEN 1 WHEN customerType = 'Corporate' THEN 2 ELSE 0 END AS CustomerTypeCode FROM Customers;
使用CASE WHEN可以在查询结果中创建不同的数据分组,而无需在实际数据中创建新的列。
SELECT productName, SUM(quantity) AS totalQuantity, CASE WHEN SUM(quantity) > 100 THEN 'High' WHEN SUM(quantity) > 50 THEN 'Medium' ELSE 'Low' END AS QuantityGroup FROM Sales GROUP BY productName;
通过在ORDER BY子句中使用CASE WHEN,您可以根据不同条件动态调整查询结果的排序规则。
SELECT productName, unitPrice FROM Products ORDER BY CASE WHEN category = 'Electronics' THEN unitPrice WHEN category = 'Clothing' THEN unitPrice * 0.9 ELSE unitPrice * 1.1 END;
使用CASE WHEN可以在查询结果中对数据进行分位数分析,识别哪些数据点位于不同的分位数区间。
SELECT productName, unitPrice, CASE WHEN unitPrice <= PERCENTILE_CONT(0.25) WITHIN GROUP (ORDER BY unitPrice) THEN 'Q1' WHEN unitPrice <= PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY unitPrice) THEN 'Q2' WHEN unitPrice <= PERCENTILE_CONT(0.75) WITHIN GROUP (ORDER BY unitPrice) THEN 'Q3' ELSE 'Q4' END AS PriceQuartile FROM Products;
使用CASE WHEN可以根据条件将缺失的数据点填充为特定值,从而更好地处理数据缺失情况。
SELECT orderID, orderDate, CASE WHEN orderAmount IS NULL THEN 0 ELSE orderAmount END AS FilledOrderAmount FROM Orders;
使用CASE WHEN可以对日期进行区间分析,例如判断每个日期属于哪个季节、哪个月份等。
SELECT orderDate, CASE WHEN EXTRACT(MONTH FROM orderDate) IN (12, 1, 2) THEN 'Winter' WHEN EXTRACT(MONTH FROM orderDate) IN (3, 4, 5) THEN 'Spring' WHEN EXTRACT(MONTH FROM orderDate) IN (6, 7, 8) THEN 'Summer' ELSE 'Fall' END AS Season FROM Orders;
使用CASE WHEN可以根据特定业务规则判断数据所处的不同阶段,如用户生命周期阶段、订单处理阶段等。
SELECT userID, registrationDate, CASE WHEN NOW() - registrationDate < INTERVAL '30 days' THEN 'New User' WHEN NOW() - registrationDate < INTERVAL '90 days' THEN 'Regular User' ELSE 'Inactive User' END AS UserStage FROM Users;
使用CASE WHEN可以在查询结果中根据条件选择不同的列,从而根据业务需求定制查询结果。
SELECT orderID, orderDate, CASE WHEN displayPrice = 'Gross' THEN grossPrice ELSE netPrice END AS SelectedPrice FROM Orders;
使用CASE WHEN可以根据条件识别和标记异常数据点,帮助进行数据质量分析。
SELECT customerID, orderDate, orderAmount, CASE WHEN orderAmount < 0 THEN 'Negative' WHEN orderAmount > 10000 THEN 'High Amount' ELSE 'Normal' END AS DataQuality FROM Orders;
使用CASE WHEN可以在不同的数据格式之间进行转换,例如将布尔值转换为文本标签。
SELECT productID, productName, inStock, CASE WHEN inStock THEN 'Available' ELSE 'Out of Stock' END AS StockStatus FROM Products;
上一篇:反序列化渗透与防御之PHP