另一个简单的SQL问题

时间:2009-09-30 13:26:44

标签: sql sql-server sql-server-2005 tsql

我有这个查询和计数(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(例如)两次甚至更多,查询应按主要类别返回产品数量

8 个答案:

答案 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