sql交叉表计算

时间:2014-12-16 02:30:51

标签: sql-server oracle

您好我需要编写一个执行多项操作的查询,我这样做是为了能够在一定的时间范围内以及20到30岁之间获取订单的详细信息,但是我需要检查是否订单产品成本高于设定数量

然而,该数据位于多个表中

一个表的orderid是prodcode和数量,而另一天有prod信息,如代码和价格,以及另一个表格中的第3个

所以我需要使用prodcode和数量访问产品的价格来进行交叉表计算,看看它是否超过100并尝试使用和where命令

所以如果我有3张桌子

带有oid odate custno支付的订购表格

带有oid itemid quant的有序表

项目itemid项目名称价格

我需要在查询中对这些表格进行计算

SELECT DISTINCT Orderplaced.OID, Orderplaced.odate, Orderplaced.custno, Orderplaced.paid
FROM Cust, Orderplaced, items, Ordered
WHERE Orderplaced.odate BETWEEN '01-JUL-14' AND '31-DEC-14'
AND Floor((sysdate-Cust.DOB) / 365.25) Between '20' AND '30'
AND Cust.SEX='M'
AND items.itemid=ordered.itemid
AND $sum(ordered.quan*item.PRICE) >100;

无论以何种方式我尝试使计算工作它似乎总是返回相同的结果,即使在100美元以下的订单

所以关于这方面的任何建议对我的学习都很好,但是让我很烦恼

2 个答案:

答案 0 :(得分:1)

我认为这就是你想要的。 (我不熟悉$ sum,我用SUM()代替它

SELECT 
  Orderplaced.OID,
  Orderplaced.odate,
  Orderplaced.custno,
  Orderplaced.paid,
  sum(ordered.quan * item.PRICE)
FROM
  Cust 
  JOIN Orderplaced ON Cust.CustNo = Orderplaced.custno
  JOIN Ordered ON Ordered.Oid = Orderplaced.Oid
  JOIN items ON items.itemid = ordered.itemid
WHERE
  Orderplaced.odate BETWEEN date 2014-07-01  AND date 2014-12-31
  AND Floor((sysdate-Cust.DOB) / 365.25) Between 20 AND 30
  AND Cust.SEX = 'M'
GROUP BY
  Orderplaced.OID,
  Orderplaced.odate,
  Orderplaced.custno,
  Orderplaced.paid  
HAVING  
  sum(ordered.quant * item.PRICE) > 100;

答案 1 :(得分:0)

我想你想尝试这样的事情......

SELECT DISTINCT Orderplaced.OID, Orderplaced.odate, Orderplaced.custno, Orderplaced.paid
FROM Cust
JOIN Orderplaced ON
    Cust.<SOMEID> = OrderPlaces.<CustId>
AND Orderplaced.odate BETWEEN '01-JUL-14' AND '31-DEC-14'
 WHERE Floor((sysdate-Cust.DOB) / 365.25) Between 20 AND 30
AND Cust.SEX='M'
AND (
SELECT SUM(Ordered.quan*Item.PRICE)
FROM Ordered
    JOIN Item ON Item.ItemId = Ordered.ItemId
WHERE Ordered.<SomeId> = OrderPlaced.<SomeId>) > 100

几点指示:
1. Floor返回一个数字......你将它与一个字符串进行比较
2.通常,在引用查询中的表时,必须将表连接到其主键上,即。在您的查询中,您引用了Item并已订购,而无需在任何键列上加入任何这些表。

希望有所帮助