带条件的SQL语句

时间:2020-11-11 06:18:43

标签: sql select conditional-statements

我是SQL的新手,正在尝试在SQL查询中添加条件。

我每年有4个产品定价文件,另外还有一个产品表。

>> mongodump --db=test --collection=test --query="{ \"_id\": { \"$eq\" : { \"$oid\": \"5fab80615397db06f00503c3\" } } }"
2020-11-11T11:42:13.705+0530    writing test.test to dump\test\test.bson
2020-11-11T11:42:13.737+0530    done dumping test.test (1 document)

所有表的数据如下

price_table_2020 price_table_2019 price_table_2019

price_table_2020

product price product_description ------------------------------------- ball 100 plastic ball ink 80 ink for pen pen 1000 pen bucket 200 bucket

price_table_2019

product price product_description ------------------------------------ ball 90 plastic ball ink 70 ink for pen pen 900 pen bucket 100 bucket

price_table_2018

产品表如下:

product  price   product_description
-------------------------------------
ball      80     plastic ball
ink       60     ink for pen
pen      800     pen
bucket   300     bucket

根据发票的年份,我应该从相应的表格中获取相应产品的价格。

预期输出如下:

product invoice_year
---------------------
pen     2019
ball    2020
ink     2020

我可以从下面的一张表中获取价格

product invoice_year   price
----------------------------
pen     2019           900
ball    2020           100
ink     2020            80

如果我必须包含基于select A.price, B.product, B.product_description from product A inner join price_table_2020 B on A.product = B.product 的逻辑,有人可以帮忙吗?谢谢。

2 个答案:

答案 0 :(得分:3)

至少可以说,您尝试做的事情很困难。我强烈建议您重组表以将所有价格数据放在一个表中,并在该表中添加一个year列以指示价格适用于哪一年。然后您的查询变得简单:

SELECT pr.product,
       pr.invoice_year,
       pc.price
FROM product pr
JOIN price_table pc ON pc.product = pr.product
                   AND pc.year = pr.invoice_year
ORDER BY pr.invoice_year, pr.product

输出(用于您的示例数据):

product     invoice_year    price
pen         2019            900
ball        2020            100
ink         2020            80

Demo on db-fiddle

如果必须保持当前的表结构,则可以使用所有price表中的UNION来模拟上面的price表:

SELECT pr.product,
       pr.invoice_year,
       pc.price
FROM product pr
JOIN (
  SELECT *, 2020 AS year
  FROM price_table_2020
  UNION ALL
  SELECT *, 2019
  FROM price_table_2019
  UNION ALL
  SELECT *, 2018
  FROM price_table_2018
) pc ON pc.product = pr.product
    AND pc.year = pr.invoice_year
ORDER BY pr.invoice_year, pr.product

此查询的输出是相同的。这种方法的缺点是,每次添加新的price表时,您都必须编辑查询。

Demo on db-fiddle

答案 1 :(得分:3)

这是一个非常糟糕的数据模型。数据属于表,而不属于数据库结构。年仅仅是数据(可以从产品表中看到),它应该是价格表中的数据。相反,您每年有一个单独的价格表。如下所示,这使编写查询变得很麻烦。我建议您更改此数据模型。

select p.*, coalesce(p2018.price, p2019.price, p2020.price) as invoice_price
from products p
left join price_table_2018 p2018 on p2018.product = p.product and p.invoice_year = 2018
left join price_table_2019 p2019 on p2019.product = p.product and p.invoice_year = 2019
left join price_table_2020 p2020 on p2020.product = p.product and p.invoice_year = 2020
order by p.product;