如何根据SQL中其他属性的值设置一个属性的值?

How to set the value of an attribute according to the values of other attributes in SQL?

我正在尝试根据其他属性的值设置一个属性的值。

我有以下 SQL 声明,

SELECT C.course_name, C.language, C.course_price, C.average_rating, C.category, P.name, P.surname, D.percentage, D.start_date, D.end_date, D.is_allowed
FROM course C LEFT OUTER JOIN discount D ON C.course_id=D.discounted_course_id, course_creator CC, person P
WHERE C.course_creator_id=CC.course_creator_id AND CC.course_creator_id=P.person_id

我有以下结果,

预期结果与上面相同,但是,第一行的 course_price 是 500。

我想根据以下设置 course_price:

如果当天小于 end_date 且 is_allowed = 1,那么我想将折扣百分比应用于 course_price。例如,由于第一个元组的 course_price 是 1000,百分比是 50,(假设 end_date 比今天的日期大),并且 is_allowed=1。那么 course_price 应该等于 500.

课程关系:

课程创建者关系:

折扣关系:

人际关系:

我想获取所有课程及其信息,如果折扣关系具有课程的 course_id 并且 is_allowed 是,则将这些课程的 course_price 设置为折扣价1、折扣end_date比今天日期

您可以为此使用 IF 或 CASE(SQL92 兼容)函数。许多 RDBMS 都有它。

这里是 MySql 的示例,取自 here:

SELECT book_name,
IF(pub_lang='English',"English Book","Other Language") 
AS Language 
FROM book_mast;

数据:

+---------+-------------------------------------+-------------+---------+--------+--------+------------+----------+---------+------------+
| book_id | book_name                           | isbn_no     | cate_id | aut_id | pub_id | dt_of_pub  | pub_lang | no_page | book_price |
+---------+-------------------------------------+-------------+---------+--------+--------+------------+----------+---------+------------+
| BK001   | Introduction to Electrodynamics     | 0000979001  | CA001   | AUT001 | P003   | 2001-05-08 | English  |     201 |      85.00 |
| BK002   | Understanding of Steel Construction | 0000979002  | CA002   | AUT002 | P001   | 2003-07-15 | English  |     300 |     105.50 |
| BK003   | Guide to Networking                 | 0000979003  | CA003   | AUT003 | P002   | 2002-09-10 | Hindi    |     510 |     200.00 |
| BK004   | Transfer  of Heat and Mass          | 0000979004  | CA002   | AUT004 | P004   | 2004-02-16 | English  |     600 |     250.00 |
| BK005   | Conceptual Physics                  | 0000979005  | CA001   | AUT005 | P006   | 2003-07-16 | NULL     |     345 |     145.00 |
| BK006   | Fundamentals of Heat                | 0000979006  | CA001   | AUT006 | P005   | 2003-08-10 | German   |     247 |     112.00 |
| BK007   | Advanced 3d Graphics                | 0000979007  | CA003   | AUT007 | P002   | 2004-02-16 | Hindi    |     165 |      56.00 |
| BK008   | Human Anatomy                       | 0000979008  | CA005   | AUT008 | P006   | 2001-05-17 | German   |      88 |      50.50 |
| BK009   | Mental Health Nursing               | 0000979009  | CA005   | AUT009 | P007   | 2004-02-10 | English  |     350 |     145.00 |
| BK010   | Fundamentals of Thermodynamics      | 0000979010  | CA002   | AUT010 | P007   | 2002-10-14 | English  |     400 |     225.00 |
| BK011   | The Experimental Analysis of Cat    | 0000979011  | CA004   | AUT011 | P005   | 2007-06-09 | French   |     225 |      95.00 |
| BK012   | The Nature  of World                | 0000979012  | CA004   | AUT005 | P008   | 2005-12-20 | English  |     350 |      88.00 |
| BK013   | Environment a Sustainable Future    | 0000979013  | CA004   | AUT012 | P001   | 2003-10-27 | German   |     165 |     100.00 |
| BK014   | Concepts in Health                  | 0000979014  | CA005   | AUT013 | P004   | 2001-08-25 | NULL     |     320 |     180.00 |
| BK015   | Anatomy & Physiology                | 0000979015  | CA005   | AUT014 | P008   | 2000-10-10 | Hindi    |     225 |     135.00 |
| BK016   | Networks and Telecommunications     | 00009790_16 | CA003   | AUT015 | P003   | 2002-01-01 | French   |      95 |      45.00 |
+---------+-------------------------------------+-------------+---------+--------+--------+------------+----------+---------+------------+

结果:

+-------------------------------------+----------------+
| book_name                           | Language       |
+-------------------------------------+----------------+
| Introduction to Electrodynamics     | Engllish Book  | 
| Understanding of Steel Construction | Engllish Book  | 
| Guide to Networking                 | Other Lnaguage | 
| Transfer  of Heat and Mass          | Engllish Book  | 
| Conceptual Physics                  | Other Lnaguage | 
| Fundamentals of Heat                | Other Lnaguage | 
| Advanced 3d Graphics                | Other Lnaguage | 
| Human Anatomy                       | Other Lnaguage | 
| Mental Health Nursing               | Engllish Book  | 
| Fundamentals of Thermodynamics      | Engllish Book  | 
| The Experimental Analysis of Cat    | Other Lnaguage | 
| The Nature  of World                | Engllish Book  | 
| Environment a Sustainable Future    | Other Lnaguage | 
| Concepts in Health                  | Other Lnaguage | 
| Anatomy & Physiology                | Other Lnaguage | 
| Networks and Telecommunications     | Other Lnaguage | 
+-------------------------------------+----------------+

If current day is less than end_date and is_allowed = 1, Then I want to apply the discount percentage to the course_price.

您似乎想要一个 CASE 表达式:

SELECT C.course_name, C.language, C.course_price, C.average_rating, C.category,
     P.name, P.surname,
     D.percentage, D.start_date, D.end_date, D.is_allowed,
     (CASE WHEN current_date < D.end_date and D.is_allowed
           THEN C.course_price * D.percentage
           ELSE c.course_price
      END) as imputed_price
FROM course C LEFT OUTER JOIN
    discount D 
    ON C.course_id = D.discounted_course_id LEFT JOIN
    course_creator CC
    ON C.course_creator_id = CC.course_creator_id LEFT JOIN
    person P
    ON CC.course_creator_id = P.person_id;

请注意,这也修复了 JOIN 语法。 从不FROM 子句中使用逗号!

因为我在你的问题中没有看到确切的 RDBMS,所以我会给你一个 应该 在 mssql server 中工作的查询(请注意,我无法用确切的数据验证查询所以我可能有错别字)。

在 mssql 中,您可以很容易地将选择转换为更新。可能也在其他数据库中。

UPDATE C
SET course_price = course_price * ((100-percentage) / 100)
FROM course C 
LEFT OUTER JOIN discount D ON C.course_id=D.discounted_course_id, 
course_creator CC, person P
WHERE C.course_creator_id=CC.course_creator_id 
    AND CC.course_creator_id=P.person_id
    AND end_date < GETDATE()
    AND is_allowed = 1
    AND C.course_id = course.course_id -- course is the table in the update statement