计算多连接语句后的重复行数

时间:2011-10-05 22:52:19

标签: sql sql-server

我有三个表需要从中检索信息:Products,ProductOptions和OptionChoices。截至目前,这是我用来获取所述信息的SQL

select P.ProductId,P.Name,P.StoreId,PO.OptionId,OC.ChoiceName from Products P
inner join ProductOptions PO on P.ProductId=PO.ProductID
inner join OptionChoices OC on PO.OptionId=OC.OptionId
where P.ProductId=23317

输出:

ProductId   Name               StoreID OptionId ChoiceName
23317   Admiral Ackbar Cereal   629     795      fish
23317   Admiral Ackbar Cereal   629     795      shrimp
23317   Admiral Ackbar Cereal   629     795      traps
23317   Admiral Ackbar Cereal   629     797      box
23317   Admiral Ackbar Cereal   629     797      casket

如果我能再增加一列可以给出每个OptionId的选择总数,那么什么会让我的生活变得更轻松。所以第一行会显示:

ProductId   Name               StoreID OptionId ChoiceName  Count
23317   Admiral Ackbar Cereal   629     795      fish         3

因为有3个选项,其中795为OptionIds。我尝试过使用group by和count的不同组合,但没有运气。任何人都有任何想法指出我正确的方向?

编辑: 我正在使用SQL Server

4 个答案:

答案 0 :(得分:1)

试试这个: - )

select P.ProductId,P.Name,P.StoreId, PO.OptionId, max(OC.ChoiceName), count(P.ProductId) from Products P
inner join ProductOptions PO on P.ProductId=PO.ProductID
inner join OptionChoices OC on PO.OptionId=OC.OptionId
where P.ProductId=23317
GROUP BY P.ProductId, PO.OptionId 

问题是你不知道你获得的字段“OC.ChoiceName” - 你也可以使用GROUP_CONCAT(OC.ChoiceName)

请参阅:http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html

max:

的结果
ProductId   Name               StoreID OptionId ChoiceName  Count
23317   Admiral Ackbar Cereal   629     795      traps        3
23317   Admiral Ackbar Cereal   629     797      box          2

GROUP_CONCAT(仅限MySQL !!)的结果:

ProductId   Name               StoreID OptionId ChoiceName           Count
23317   Admiral Ackbar Cereal   629     795      fish,shrimp,traps      3
23317   Admiral Ackbar Cereal   629     797      box,casket             2

答案 1 :(得分:1)

您需要单独的查询来计算选项。在这个MS SQL SERVER示例中,我使用了相关的子查询来进行计数。

SELECT
  P.ProductId,
  P.Name,
  P.StoreId,
  PO.OptionId,
  OC.ChoiceName,
  (SELECT COUNT(*) FROM OptionChoices WHERE OptionId = OC.OptionId) AS option_count
FROM
  Products   P
INNER JOIN
  ProductOptions PO
    ON P.ProductId = PO.ProductID
INNER JOIN
  OptionChoices  OC
    ON PO.OptionId = OC.OptionId    
WHERE
  P.ProductId=23317

答案 2 :(得分:1)

你太近了......

做:

Select p.Productid, p.name,     
P.storeid,P.optionid, Count(choicename) 
From ( your actual query here) p
Group by p.productid,p.name,p.storeid,p.optionid

答案 3 :(得分:0)

select
      P.ProductId
    , P.Name
    , P.StoreId
    , PO.OptionId
    , OC.ChoiceName
    , count(PO.OptionId) over (partition by P.StoreId) as OpCount
from Products P
inner join ProductOptions PO on P.ProductId = PO.ProductID
inner join OptionChoices OC  on PO.OptionId = OC.OptionId
where P.ProductId = 23317