2012-04-20 38 views
1

我希望按所有字段进行分组。我通过使用 - WITH关键字来实现它。 有没有其他方法可以做到这一点? 选择按所有字段分组的结果

WITH T AS (SELECT a.codeid AS VendorID , 
            a.hname , 
            a.hnamee , 
            CASE WHEN v.AudienceID = 0 THEN 1 
             ELSE 0 
            END AS HasAll 
          FROM  dbo.dtAny AS a 
            LEFT JOIN VendorAudience AS v ON a.codeid = v.VendorID 
          WHERE a.hrclvl = @level 
            AND a.dcode = @dcode 
            AND a.codeid = ISNULL(@VendorID, a.codeid) 
         ) 
    SELECT VendorID , 
      hname , 
      hnamee , 
      HasAll 
    FROM T 
    GROUP BY vendorid , 
      hname , 
      hnamee , 
      HasAll 

我想是这样的:

SELECT a.codeid AS VendorID , 
            a.hname , 
            a.hnamee , 
            CASE WHEN v.AudienceID = 0 THEN 1 
             ELSE 0 
            END AS HasAll 
          FROM  dbo.dtAny AS a 
            LEFT JOIN VendorAudience AS v ON a.codeid = v.VendorID 
          WHERE a.hrclvl = @level 
            AND a.dcode = @dcode 
            AND a.codeid = ISNULL(@VendorID, a.codeid) 
            GROUP BY VendorID ,a.hname ,a.hnamee ,HasAll 

,但有错误的HasAll试图组(我不要v.AudienceID需要组)

+1

为什么不使用'distinct'而不是分组? – 2012-04-20 07:42:01

回答

1

的。查询应该是

SELECT a.codeid AS VendorID , 
            a.hname , 
            a.hnamee , 
            CASE WHEN v.AudienceID = 0 THEN 1 
             ELSE 0 
            END AS HasAll 
          FROM  dbo.dtAny AS a 
            LEFT JOIN VendorAudience AS v ON a.codeid = v.VendorID 
          WHERE a.hrclvl = @level 
            AND a.dcode = @dcode 
            AND a.codeid = ISNULL(@VendorID, a.codeid) 
            GROUP BY VendorID ,a.hname ,a.hnamee , 
            CASE WHEN v.AudienceID = 0 THEN 1 
             ELSE 0 
            END 
0

您可以将其用作派生表。

SELECT VendorID ,a.hname ,a.hnamee ,HasAll 
FROM (SELECT a.codeid AS VendorID , 
     a.hname , 
     a.hnamee , 
     CASE WHEN v.AudienceID = 0 THEN 1 
      ELSE 0 
     END AS HasAll 
    FROM  dbo.dtAny AS a 
     LEFT JOIN VendorAudience AS v ON a.codeid = v.VendorID 
    WHERE a.hrclvl = @level 
     AND a.dcode = @dcode 
     AND a.codeid = ISNULL(@VendorID, a.codeid)) [Table] 
GROUP BY VendorID ,a.hname ,a.hnamee ,HasAll 
+0

这是否与使用“WITH”有所不同? – levi 2012-04-20 07:49:36

0

这就是DISTINCT用于:

WITH T AS (SELECT a.codeid AS VendorID , 
         a.hname , 
         a.hnamee , 
         CASE WHEN v.AudienceID = 0 THEN 1 
          ELSE 0 
         END AS HasAll 
       FROM  dbo.dtAny AS a 
         LEFT JOIN VendorAudience AS v ON a.codeid = v.VendorID 
       WHERE a.hrclvl = @level 
         AND a.dcode = @dcode 
         AND a.codeid = ISNULL(@VendorID, a.codeid) 
      ) 
SELECT DISTINCT * 
FROM T 
0

使用DISTINCT是不必要的,如果你被所有列分组,因为输出将是唯一的反正。我倾向于同意上面的Miika,但没有理由你的原始方法不起作用。

Mac