如何根据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
我正在尝试根据其他属性的值设置一个属性的值。
我有以下 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