Oracle关系数据库

时间:2018-08-08 17:22:01

标签: oracle11g

我正在尝试实现一个代码,该代码可以过滤检查图书馆中DVD数量多于DVD的客户数量。该查询应该显示客户名称,总帐簿签出和DVD总检出。 ERD with all the tables

这是我的代码,用于计算图书总签出和DVD总签出。

SELECT C.CUSTOMER_FIRSTNAME||' '|| C.CUSTOMER_LASTNAME "CUSTOMER 
NAME",COUNT(*)"TOTAL CHECKOUTS"
FROM  CATALOG_ITEM CI
JOIN PHYSICAL_ITEM PI
ON CI.CATALOG_ITEM_ID = PI.CATALOG_ITEM_ID
JOIN TRANSACTION TI
ON PI.PHYSICAL_ITEM_ID = TI.PHYSICAL_ITEM_ID
JOIN LIBRARY_CARD LC
ON TI.LIBRARY_CARD_ID = LC.LIBRARY_CARD_ID
JOIN CUSTOMER C
ON LC.CUSTOMER_ID = C.CUSTOMER_ID
GROUP BY C.CUSTOMER_FIRSTNAME||' '|| C.CUSTOMER_LASTNAME,CI.TYPE;

1 个答案:

答案 0 :(得分:0)

我终于解决了我的问题。使用COUNT(CASE WHEN field ='record'THEN 1 END),我可以指定要在每一列上计数的记录。

    SELECT C.CUSTOMER_FIRSTNAME ||' '||C.CUSTOMER_LASTNAME "CUSTOMER NAME",
    COUNT(CASE WHEN CI.TYPE = 'BOOK' THEN 1 END)"TOTAL BOOK CHECKOUTS",
    COUNT(CASE WHEN CI.TYPE = 'DVD' THEN 1 END)"TOTAL DVD CHECKOUTS"
    FROM CATALOG_ITEM CI
    JOIN PHYSICAL_ITEM PI
    ON CI.CATALOG_ITEM_ID = PI.CATALOG_ITEM_ID
    JOIN TRANSACTION TI
    ON PI.PHYSICAL_ITEM_ID = TI.PHYSICAL_ITEM_ID
    JOIN LIBRARY_CARD LI
    ON TI.LIBRARY_CARD_ID = LI.LIBRARY_CARD_ID
    JOIN CUSTOMER C
    ON LI.CUSTOMER_ID = C.CUSTOMER_ID
    GROUP BY C.CUSTOMER_FIRSTNAME ||' '||C.CUSTOMER_LASTNAME
    HAVING COUNT(CASE WHEN CI.TYPE = 'BOOK' THEN 1 END) > COUNT(CASE WHEN CI.TYPE = 
    'DVD' THEN 1 END)
    ORDER BY C.CUSTOMER_FIRSTNAME ||' '||C.CUSTOMER_LASTNAME;

任何其他解决方案将不胜感激。