SQL在不使用Oracle pivot子句的情况下创建pivot表
我试图创建一个pivot表,但没有使用oracle pivot子句 运行此查询时,我会获得以下数据:SQL在不使用Oracle pivot子句的情况下创建pivot表,sql,oracle,Sql,Oracle,我试图创建一个pivot表,但没有使用oracle pivot子句 运行此查询时,我会获得以下数据: SELECT first_name AS driver , v.name AS truck , COUNT(haul_id) AS "Haul Count" FROM employee e JOIN haul h ON e.employee_id = h.employee_id JOIN vehicle v ON v.vehicle_id = h.vehicle_id GROUP B
SELECT first_name AS driver
, v.name AS truck
, COUNT(haul_id) AS "Haul Count"
FROM employee e JOIN haul h
ON e.employee_id = h.employee_id
JOIN vehicle v
ON v.vehicle_id = h.vehicle_id
GROUP BY first_name, v.name
ORDER BY first_name, COUNT(haul_id) DESC;
╔════════╦═════════════╦════════════╗
║ Driver ║ Truck ║ Haul Count ║
╠════════╬═════════════╬════════════╣
║ Judy ║ Big Dog ║ 5 ║
║ Judy ║ Classy Cat ║ 5 ║
║ Judy ║ Mad Max ║ 4 ║
║ Matt ║ Mad Max ║ 8 ║
║ Matt ║ Classy Cat ║ 8 ║
║ Matt ║ Big Dog ║ 5 ║
║ Troy ║ Mad Max ║ 8 ║
║ Troy ║ Big Dog ║ 4 ║
║ Troy ║ Classy Cat ║ 3 ║
╚════════╩═════════════╩════════════╝
现在,我想生成一个以透视布局显示相同数据的报告:
╔════════╦══════════╦════════════╦════════╗
║ Driver ║ Big Dog ║ Classy Cat ║ Mad Max║
╠════════╬══════════╬════════════╬════════╣
║ Judy ║ 5 ║ 5 ║ 4 ║
║ Matt ║ 5 ║ 8 ║ 8 ║
║ Troy ║ 4 ║ 3 ║ 8 ║
╚════════╩══════════╩════════════╩════════╝
经过大量的实验和试用,我的代码变得越来越大,它返回了绝对总数:
SELECT first_name
, (SELECT COUNT(h.vehicle_id)
FROM employee e JOIN haul h
ON e.employee_id = h.employee_id
JOIN vehicle v
ON v.vehicle_id = h.vehicle_id
WHERE v.name = 'Big Dog') AS "Big Dog"
FROM haul JOIN vehicle
ON haul.vehicle_id = vehicle.vehicle_id
WHERE vehicle.name = 'Classy Cat') AS "Classy Cat"
, (SELECT COUNT(haul.vehicle_id)
FROM haul JOIN vehicle
ON haul.vehicle_id = vehicle.vehicle_id
WHERE vehicle.name = 'Mad Max') AS "Mad Max"
FROM employee e JOIN haul h
ON e.employee_id = h.employee_id
JOIN vehicle v
ON v.vehicle_id = h.vehicle_id
GROUP BY first_name
ORDER BY first_name ASC;
╔════════╦══════════╦════════════╦════════╗
║ Driver ║ Big Dog ║ Classy Cat ║ Mad Max║
╠════════╬══════════╬════════════╬════════╣
║ Judy ║ 14 ║ 16 ║ 20 ║
║ Matt ║ 14 ║ 16 ║ 20 ║
║ Troy ║ 14 ║ 16 ║ 20 ║
╚════════╩══════════╩════════════╩════════╝
关于如何使其有效并返回每辆卡车的每个驾驶员的计数,有什么想法吗
谢谢您可以使用条件聚合:
使用数据透视查询并仅对名字进行聚合:
SELECT
first_name AS driver,
SUM(CASE WHEN v.name = 'Big Dog' THEN 1 ELSE 0 END) AS "Big Dog",
SUM(CASE WHEN v.name = 'Classy Cat' THEN 1 ELSE 0 END) AS "Classy Cat",
SUM(CASE WHEN v.name = 'Mad Max' THEN 1 ELSE 0 END) AS "Max"
FROM employee e JOIN haul h
ON e.employee_id = h.employee_id
JOIN vehicle v
ON v.vehicle_id = h.vehicle_id
GROUP BY first_name
ORDER BY first_name
为什么要避免子句?不是我想避免它,而是目标是练习聚合。感谢您的回复。我喜欢这个回答,因为我也在学习案例陈述,这是一个非常有效的使用方法。谢谢你的评论。这很容易理解和实现。谢谢你的意见。
SELECT
first_name AS driver,
SUM(CASE WHEN v.name = 'Big Dog' THEN 1 ELSE 0 END) AS "Big Dog",
SUM(CASE WHEN v.name = 'Classy Cat' THEN 1 ELSE 0 END) AS "Classy Cat",
SUM(CASE WHEN v.name = 'Mad Max' THEN 1 ELSE 0 END) AS "Max"
FROM employee e JOIN haul h
ON e.employee_id = h.employee_id
JOIN vehicle v
ON v.vehicle_id = h.vehicle_id
GROUP BY first_name
ORDER BY first_name