Group By语句作为列

时间:2011-08-09 17:31:32

标签: sql group-by inline

我有像

这样的伪SQL语句
select [orderid], [productname], [price], [productid_FK]
from Order

这将给我5行:

enter image description here

结果是5行,其中3行的[productid_FK]为“2”。此FK列引用名为[Product]的表。

现在假设我想要一个基于[productid_FK]的额外列。

该列必须包含另一个名为[products]

的表中的产品总数

我可以通过加入当前的伪查询来实现这个目的吗?

4 个答案:

答案 0 :(得分:6)

获得结果的一种方法是子查询。根据数据库的不同,有几种方法可以做到这一点。我经常这样做

SELECT o.[orderid], 
       o.[productname], 
       o.[price], 
       [productid_FK], 
       p_counts.k 
FROM   order o 
       INNER JOIN (SELECT productid_fk, 
                          COUNT(product_id) k 
                   FROM   products 
                   GROUP  BY productid_fk) p_counts 
         ON o.productid_fk = p_counts.productid_fk 

答案 1 :(得分:4)

SELECT p.productid, p.productname, p.price, COUNT(o.orderid)
FROM Order AS o
JOIN Product AS p ON o.productid_FK = p.productid
GROUP BY p.productid, p.productname, p.price

答案 2 :(得分:3)

在MS SQL Server 2008中,您可以在聚合(计数,总和等)上使用OVER子句。这将起作用(或至少,我为自己的表编写的版本工作:

SELECT [orderid], [productname], [price], [productid_FK]
 ,count(*) over (partition by [productid_FK])
 from Order 

我仍然觉得这样做可以做到这一点。据推测,其他RDBMS具有类似的功能。

答案 3 :(得分:0)

SELECT o.orderid, o.productname, o.price, o.productid_FK, COUNT(o.productid_FK)
FROM order o JOIN products p on o.productid_FK = p.productid
GROUP BY o.productname

应该从头开始。

您好像想知道订单中有多少产品属于您。也许你应该考虑一个稍微不同的架构设计。

[订单] [产品] 相关 n:m ,这意味着:订单可以包含许多产品和产品可以是许多订单的一部分。所以我的建议是用第三个表来处理这种关系,例如 [OrderProducts] 包含字段 [orderid] [productid] 。这样,您的 [订单] [产品] 表格将只包含与其应有的唯一订单和产品。此外,您现在在每个相应产品的 [订单] 中都有一个数据集,因此订单的所有属性都会产生很大的开销。在关系表中,您还可以存储例如如果每个产品的价格偏离正常价格或类似价格,则每个产品的特价。