0

我一直在为使用 oracle SQL 的数据库简介类做一个项目。我在尝试让我的输出一次只显示一个订单号时遇到问题。我必须加入多个表才能获得所需的信息。是否可以只使用 WHERE 语句WHERE o.order# = 10000001

SELECT 
  c.customer#,
  c.company_name,
  o.order#,
  oi.item#,
  p.product_desc AS "Product Description",
  p.product#,
  oi.order_qty,
  TO_CHAR(p.retail,  '$999.99') AS "Unit Price",
  TO_CHAR(SUM (p.retail * oi.order_qty),  '$9999.99') AS "Amount" 
FROM order_items oi 
JOIN products p ON oi.product# = p.product# 
JOIN orders o ON o.order# = oi.order# 
JOIN customers c ON c.customer# = o.customer# 
GROUP BY
  c.customer#,
  c.company_name,
  o.order#,
  oi.item#,
  p.product_desc,
  p.product#,
  oi.order_qty,
  p.retail
ORDER BY order#;

发票1SO

4

3 回答 3

0
SELECT 
  c.customer#,
  c.company_name,
  o.order#,
  oi.item#,
  p.product_desc AS "Product Description",
  p.product#,
  oi.order_qty,
  TO_CHAR(p.retail,  '$999.99') AS "Unit Price",
  TO_CHAR(SUM (p.retail * oi.order_qty),  '$9999.99') AS "Amount" 
FROM order_items oi 
JOIN products p ON oi.product# = p.product# 
JOIN orders o ON o.order# = oi.order# 
JOIN customers c ON c.customer# = o.customer#
WHERE o.order# = '10000001'
GROUP BY
  c.customer#,
  c.company_name,
  o.order#,
  oi.item#,
  p.product_desc,
  p.product#,
  oi.order_qty,
  p.retail
ORDER BY order#;

您可以在最后一个 JOIN 之后添加 WHERE 语句进行过滤。

于 2019-12-10T22:48:35.053 回答
0

WHERE 子句位于 GROUP BY 之前:

SELECT 
  c.customer#,
  c.company_name,
  o.order#,
  oi.item#,
  p.product_desc AS "Product Description",
  p.product#,
  oi.order_qty,
  TO_CHAR(p.retail,  '$999.99') AS "Unit Price",
  TO_CHAR(SUM (p.retail * oi.order_qty),  '$9999.99') AS "Amount" 
FROM order_items oi 
JOIN products p ON oi.product# = p.product# 
JOIN orders o ON o.order# = oi.order# 
JOIN customers c ON c.customer# = o.customer# 
WHERE o.order# = 10000001
GROUP BY
  c.customer#,
  c.company_name,
  o.order#,
  oi.item#,
  p.product_desc,
  p.product#,
  oi.order_qty,
  p.retail
ORDER BY order#;
于 2019-12-10T22:49:09.050 回答
0

这不是答案,但评论太长了。

您的查询中的GROUP BYandSUM完全没有意义。当您按 order# 和 item# 以及数量分组时,一个订单必须有相同数量的相同项目列出两次,因此您可以将两者相加(同时保留其他具有不同数量的重复项)。这是没有意义的。

这给我们留下了:

SELECT 
  c.customer#,
  c.company_name,
  oi.order#,
  oi.item#,
  p.product_desc AS "Product Description",
  p.product#,
  oi.order_qty,
  TO_CHAR(p.retail,  '$999.99') AS "Unit Price",
  TO_CHAR(p.retail * oi.order_qty,  '$9999.99') AS "Amount" 
FROM order_items oi 
JOIN products p ON oi.product# = p.product# 
JOIN orders o ON o.order# = oi.order# 
JOIN customers c ON c.customer# = o.customer#
WHERE o.order# = 10000001
ORDER BY oi.item#;

至于数据模型:您应该将价格存储在order_items. 否则,当某个时间更改商品的价格时,您会不自觉地更改现有订单。

至于TO_CHAR:我会避免它。让您的应用或网站处理布局。它应该比 DBMS(以及您在设计时)更了解用户喜欢哪些本地设置(例如,哪个小数分隔符)。向您的应用显示它正在处理一个数字,而不是一个字符串。

于 2019-12-10T22:56:31.770 回答