我有三个表需要从中检索信息: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
答案 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