Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 计算multi-join语句后重复的行数_Sql_Sql Server - Fatal编程技术网

Sql 计算multi-join语句后重复的行数

Sql 计算multi-join语句后重复的行数,sql,sql-server,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

我需要从三个表中检索信息: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
让我的生活更轻松的是,如果我能再添加一列,让我知道每个选项ID的选择总数。所以第一行应该是:

ProductId   Name               StoreID OptionId ChoiceName  Count
23317   Admiral Ackbar Cereal   629     795      fish         3
因为有3个选项,795是他们的选项ID。我试过使用分组和计数的不同组合,但没有成功。有没有人能给我指出正确的方向

编辑: 我正在使用SQL Server

尝试以下操作:-)

问题是,您不知道字段“OC.ChoiceName”会得到什么-您也可以使用GROUP_CONCAT(OC.ChoiceName)

见:

最大值的结果:

ProductId   Name               StoreID OptionId ChoiceName  Count
23317   Admiral Ackbar Cereal   629     795      traps        3
23317   Admiral Ackbar Cereal   629     797      box          2
组_CONCAT的结果(仅MySQL!!):

试试这个:-)

问题是,您不知道字段“OC.ChoiceName”会得到什么-您也可以使用GROUP_CONCAT(OC.ChoiceName)

见:

最大值的结果:

ProductId   Name               StoreID OptionId ChoiceName  Count
23317   Admiral Ackbar Cereal   629     795      traps        3
23317   Admiral Ackbar Cereal   629     797      box          2
组_CONCAT的结果(仅MySQL!!):


您需要一个单独的查询来统计选项。在这个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

您需要一个单独的查询来统计选项。在这个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
你是如此接近

做:

你是如此接近

做:



您使用的是什么版本的SQL?SQL server。刚刚更新了我的问题您使用的是什么版本的SQL?SQL server。刚刚更新了我的问题,每个问题都有错误。对于第一列:“Products.ProductId”在选择列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。对于第二个问题:“groupconcat”附近的语法不正确。如果helpsGROUP_CONCAT是MySQL,那么使用Sql server-抱歉-忘记了“P.”和“PO.”在“分组方式”中-请再次尝试在夏天,每次都会出错。对于第一列:“Products.ProductId”在选择列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。对于第二个问题:“groupconcat”附近的语法不正确。如果helpsGROUP_CONCAT是MySQL,请使用Sql server-抱歉-在“分组方式”中忘记了“P.”和“PO.”-再次尝试从结果集中删除选项_name。OP需要每个记录以及组中的记录计数…列“OptionChoices.Name”在选择列表中无效,因为它既不包含在聚合函数中,也不包含在group BY子句中。亲爱的SO'ers,我在单元格中编写了我的语句,在移动版本中很难看到全部内容,如果需要选项_name,则应选择;如果不需要重复值,则应按该列对其进行分组。其思想是选择所有重复的列,并对不重复的列进行计数,按所有未包含在计数中的列进行分组。OP希望集合中的每一项都没有分组、重复数据消除或任何其他功能。然后,作为附加字段,需要子组的计数。仅引用一次OptionChoices表是无法实现的。@dems我的错误是,我认为他只需要不同的列+相同产品的选项数。这会从结果集中删除选项名称。OP需要每个记录以及组中的记录计数…列“OptionChoices.Name”在选择列表中无效,因为它既不包含在聚合函数中,也不包含在group BY子句中。亲爱的SO'ers,我在单元格中编写了我的语句,在移动版本中很难看到全部内容,如果需要选项_name,则应选择;如果不需要重复值,则应按该列对其进行分组。其思想是选择所有重复的列,并对不重复的列进行计数,按所有未包含在计数中的列进行分组。OP希望集合中的每一项都没有分组、重复数据消除或任何其他功能。然后,作为附加字段,需要子组的计数。这不可能只用一次对OptionChoices表的引用就实现。@dems我犯了个错误,当时我以为他只想要不同的列+相同产品的选择数。这完全奏效了。谢谢我将花一些时间阅读这个查询以找出答案。性能“问题”将完全取决于索引和相关数据集的大小。由于此查询具有
P.ProductId=23317
,因此相关子查询实际上只与少量记录相关。另外,请注意,SQL Server非常擅长对此进行优化。也就是说,对于较大的数据集,加入
(从OptionChoices GROUP BY OptionID中选择OptionID,COUNT(*)将更快。这与生产无关。我需要生成一些报告,这只会帮助我更快地完成任务。这完全奏效了。谢谢我将花一些时间阅读这个查询以找出答案。性能“问题”将完全取决于索引和相关数据集的大小。由于此查询具有
P.ProductId=23317
,因此相关子查询实际上只与少量记录相关。另外,请注意,SQL Server非常擅长对此进行优化。也就是说,对于较大的数据集,加入
(从OptionChoices GROUP BY OptionID中选择OptionID,COUNT(*)将更快。这与生产无关。我需要生成一些报告,这只会帮助我更快地完成任务。
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
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