Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL在不使用Oracle pivot子句的情况下创建pivot表_Sql_Oracle - Fatal编程技术网

SQL在不使用Oracle pivot子句的情况下创建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

我试图创建一个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 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