尝试使用 case when 语句计算 sql 中的不同元素

Trying to count distinct elements in sql with case when statement

大家好,这里是第二学期的 comp sci 学生。我决定用我创建的这个数据库项目来解决一些问题。数据库可以工作,但我们在 class 中没有学到任何关于使用计数函数的“case when”语句的知识,但我正在努力自学。

这是我试图显示每本书售出多少的问题,但出于某种原因,在我创建的视图中,这里的计数不正确。

下面是创建视图的代码:

--12。 write 2 SQL views view语句集应该包含SELECT语句来查看views

CREATE VIEW booksSold
AS
SELECT
    bookNumber,
    bookTitle,
    bookPrice,
    COUNT( CASE bookNumber_FK WHEN (bookNumber = bookNumber_FK) THEN 1 ELSE 0 END) as Number_Sold
FROM Book 
JOIN isSoldIn ON Book.bookNumber = isSoldIn.bookNumber_FK
GROUP BY bookNumber;


SELECT * 
FROM booksSold;

这段代码将所有内容都放在一列中,就像我想要的那样,但它只是没有正确计算所有内容,当我知道有些行应该超过 2 时,它只增加到 2。

我还附上了 MariaDB MySQL 服务器屏幕的屏幕截图,这样您就可以看到当我输入查询时发生了什么。

正如我所说,没有教过这个,只是一直在尝试自学如何做count(case when...) 到不同的列(不是我想要的)或者它引导我展示如何计算单个项目。可能是我搜索不够准确?

MYSQL MARIADB image

*EDIT 示例数据请求已添加如下:

插入 vvvv

INSERT INTO Book(bookNumber, bookTitle, bookAuthor, bookPrice, bookGenre, orderNumber_FK, publisherName_FK)                                                                                         
VALUES                                                          
    ("1",   "STer WuRs",    "Minestrone",   23.5,   "Sci-Fi",   "1",    "Penguin Publishing"),                                                              
    ("2",   "Waldo is Where?",  "Branston", 15.25,  "Children's",   "2",    "Capital Publishing"),                                                              
    ("3",   "Parry Hotter", "Worling",  19.99,  "Fantasy",  "3",    "Decent Publishing "),                                                              
    ("4",   "Comic Sans the Comic", "Sansom",   12.99,  "Graphic Novels and Comics",    "4",    "Pretty Darn Great Publishing"),                                                                
    ("5",   "What is Email?",   "Thompson", 99.99,  "Textbooks/Informational",  "5",    "What is Email Publishing")
    
    ;                                                               
                                                                                            
                                                                                            
                                                                                            
                                                                                            
                                                                                            
INSERT INTO BookSale(saleNum, employeeNumber_FK, customerNumber_FK, saleDate, saleAmount)                                                                                           
VALUES                                                                  
    ("1",   "4",    "7", "2022-03-29",  38.75),                                                                     
    ("2",   "5",    "6", "2022-04-03",  19.99),                                                                     
    ("3",   "1",    "5", "2022-04-05",  56.48),                                                                     
    ("4",   "2",    "4", "2022-04-06",  99.99),                                                                     
    ("5",   "3",    "3", "2022-04-15",  99.99),                                                                     
    ("6",   "1",    "2", "2022-04-19",  28.24),                                                                     
    ("7",   "2",    "1", "2022-04-24",  132.97)
    
    ;                                                                       
                                                                                            
                                                                                            
                                                                                            
                                                                                            
                                                                                            
INSERT INTO isSoldIn(soldInNum, bookNumber_FK, saleNum_FK)                                                                                          
VALUES                                                                          
    ("1",   "1",    "1"),                                                                               
    ("2",   "2",    "1"),                                                                               
    ("3",   "3",    "2"),                                                                               
    ("4",   "3",    "3"),                                                                               
    ("5",   "4",    "3"),                                                                               
    ("6",   "1",    "3"),                                                                               
    ("7",   "5",    "4"),                                                                               
    ("8",   "5",    "5"),                                                                               
    ("9",   "2",    "6"),                                                                               
    ("10",  "4",    "6"),                                                                               
    ("11",  "3",    "7"),                                                                               
    ("12",  "4",    "7"),                                                                               
    ("13",  "5",    "7")
    
    ;                                            

创建 TABLE vvvvvvvv

-- -- -- -- -- -- -- -- -- -- -- -- Book -- -- -- -- -- -- -- -- -- -- -- --

-- Creating the Book Table
-- Primary Key: bookNumber
-- Foreign Keys: orderNumber_FK, publisherName_FK

CREATE TABLE Book
(

    bookNumber VARCHAR(5) NOT NULL,
    bookTitle VARCHAR(50),
    bookAuthor VARCHAR(50),
    bookPrice DOUBLE,
    bookGenre VARCHAR(50),
    orderNumber_FK VARCHAR(5),
    publisherName_FK VARCHAR(30),

    CONSTRAINT Book_PK PRIMARY KEY (bookNumber),

    CONSTRAINT Book_FK1 FOREIGN KEY (orderNumber_FK)
    REFERENCES PublisherOrders (orderNumber)
    ON DELETE CASCADE,

    CONSTRAINT Book_FK2 FOREIGN KEY (publisherName_FK)
    REFERENCES PublisherCompany (publisherName)
    ON DELETE CASCADE

);

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --





-- -- -- -- -- -- -- -- -- -- -- -- BookSale-- -- -- -- -- -- -- -- -- -- -- 

-- Creating the BookSale Table
-- Primary Key: saleNum
-- Foreign Keys: employeeNumber_FK, customerNumber_FK

CREATE TABLE BookSale
(

    saleNum VARCHAR(5) NOT NULL,
    employeeNumber_FK VARCHAR(5),
    customerNumber_FK VARCHAR(5),
    saleDate DATE,
    saleAmount DOUBLE,

    CONSTRAINT BookSale_PK PRIMARY KEY (saleNum),

    CONSTRAINT BookSale_FK1 FOREIGN KEY (employeeNumber_FK)
    REFERENCES Employee (employeeNumber)
    ON DELETE CASCADE,

    CONSTRAINT BookSale_FK2 FOREIGN KEY (customerNumber_FK)
    REFERENCES Customer (customerNumber)
    ON DELETE CASCADE

);

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --





-- -- -- -- -- -- -- -- -- -- -- -- IsSoldIn -- -- -- -- -- -- -- -- -- -- -- 

-- Creating the IsSoldIn Table
-- Primary Keys: soldInNum, bookNumber_FK, saleNum_FK
-- Foreign Keys: bookNumber_FK, saleNum_FK

CREATE TABLE IsSoldIn
(

    soldInNum VARCHAR(5) NOT NULL,
    bookNumber_FK VARCHAR(5),
    saleNum_FK VARCHAR(5),

    CONSTRAINT IsSoldIn_PK PRIMARY KEY (soldInNum),

    CONSTRAINT IsSoldIn_FK1 FOREIGN KEY (bookNumber_FK)
    REFERENCES Book (bookNumber)
    ON DELETE CASCADE,

    CONSTRAINT IsSoldIn_FK2 FOREIGN KEY (saleNum_FK)
    REFERENCES BookSale (saleNum)
    ON DELETE CASCADE

);

不需要 CASE 表达式。只需计算连接 table.

中的行数
CREATE VIEW booksSold
AS
SELECT
    bookNumber,
    bookTitle,
    bookPrice,
    COUNT(*) as Number_Sold
FROM Book 
JOIN isSoldIn ON Book.bookNumber = isSoldIn.bookNumber_FK
GROUP BY bookNumber;

如果你想把未售出的书归零,你需要使用LEFT JOIN

CREATE VIEW booksSold
AS
SELECT
    bookNumber,
    bookTitle,
    bookPrice,
    COUNT(isSoldIn.bookNumber_FK) as Number_Sold
FROM Book 
LEFT JOIN isSoldIn ON Book.bookNumber = isSoldIn.bookNumber_FK
GROUP BY bookNumber;

COUNT(*) 必须更改为 COUNT(isSoldIn.bookNumber_FK) 以便不计算 isSoldIn table 中具有空值的行,因为没有匹配项。

DEMO