我有这个查询和计数(artikel.artikelid)返回2而不是3。 我知道为什么,因为我在'where in ...'部分有两次artikelid(8135),但我希望它返回3
这是我的问题查询:
SELECT cg.CategorieGroepID,
cg.GroepsNaam,
cg.BenodigdAantal,
cg.ActieCatId,
cg.ActieActief,
count(Artikel.ArtikelID)
FROM CategorieGroep cg INNER JOIN
Categorie ON cg.CategorieGroepID = Categorie.CategorieGroepID INNER JOIN
Artikel ON Categorie.CategorieID = Artikel.CategorieID
where artikel.artikelid in(8135,8135,7914)
group by cg.CategorieGroepID,
cg.GroepsNaam,
cg.BenodigdAantal,
cg.ActieCatId,
cg.ActieActief
事情太清楚了
artikel.artikelid in(8135,8135,7914)
part意味着稍后用于artikelid的动态数组
人们可以使用相同的artikelid两次,然后查询应该返回2而不是1。 如果我的问题不完全清楚,我很抱歉。
它用于构建用户shoppingbasket的概述。 人们可以订购artikelid 8135(例如)两次甚至更多,查询应按主要类别返回产品数量
答案 0 :(得分:2)
为了生成三条记录,您需要将表与另一个包含三条记录的表联系起来。某些SQL数据库系统允许您将其指定为子查询,指定代码或创建包含(8135,8135,7914)的内存表,以便您可以加入它。但是如果你的SQL引擎很简单,你实际上需要将它插入一个真实的表中。
但是,我假设这些数字来自程序代码,所以如果编程源代码知道数字的数量,为什么不使用它呢?
第三种解决方案:如果您的SQL数据库支持子选择内的联合,那么您可以将“join artikel”替换为“join(选择...来自artikel,其中artikelid = 8135 ... union select ... from artikel artikelid = 8135 ...联合选择...来自artikel,其中artikelid = 7914)。
答案 1 :(得分:0)
请注意,在IN子句列表中有多少次无关紧要,它仍然只能匹配每行一次。
所以关于你在列表中有8135两次的部分,这不是你得到2或3或其他什么的原因。在内部,它将被视为一个匹配的唯一值。
答案 2 :(得分:0)
它只返回2,因为其中一个匹配(8135,8135 ......中的(冗余)条件。
答案 3 :(得分:0)
如果实际上没有2条artikelid为8135的记录则不会返回3.为什么不这样做
SELECT cg.CategorieGroepID,cg.GroepsNaam,cg.BenodigdAantal,cg.ActieCatId,cg.ActieActief,3?
答案 4 :(得分:0)
如果您知道要让该列返回3,则可以使用“3”而不是count(Artikel.ArtikelID)结束select子句。
答案 5 :(得分:0)
您是否无法添加rowindex列以具有连续值,然后计算此列?
答案 6 :(得分:0)
您可以根据需要将值8135放入In(...)子句中,并且不会影响使用该值返回的行数,Count(ArtikelID)应该相同,即使它列出10次。如果查询返回'2',则表示返回的行集中有2行...一行值为8135,一行值为7914.
你究竟想要计算你试图解决查询产生的'3'的值是什么?您的In Clause中的条目数量?或与表中数据相关的东西?
如果您尝试将值为8135的行 计算 两次,则不能通过在In子句中列出值两次来执行此操作。
答案 7 :(得分:0)
SELECT cg.CategorieGroepID,
cg.GroepsNaam,
cg.BenodigdAantal,
cg.ActieCatId,
cg.ActieActief,
count(a.ArtikelID),
case cg.BenodigdAantal
when 0 then 0 else count(a.ArtikelID)/cg.BenodigdAantal end as gratisart
FROM CategorieGroep cg INNER JOIN
Categorie ON cg.CategorieGroepID = Categorie.CategorieGroepID INNER JOIN
Artikel a ON Categorie.CategorieID = a.CategorieID,
(SELECT artikelid FROM Artikel WHERE artikelid=8135 UNION ALL
SELECT artikelid FROM Artikel WHERE artikelid=8135 UNION ALL
SELECT artikelid FROM Artikel WHERE artikelid=8135 UNION ALL
SELECT artikelid FROM Artikel WHERE artikelid=7600 UNION ALL
SELECT artikelid FROM Artikel WHERE artikelid=7914) b
where a.artikelid = b.artikelid
group by cg.CategorieGroepID,
cg.GroepsNaam,
cg.BenodigdAantal,
cg.ActieCatId,
cg.ActieActief