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 分组)

4

4 回答 4

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
于 2012-04-20T07:42:45.987 回答
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
于 2012-04-20T07:44:59.927 回答
0

如果您按所有列分组,则无需使用 DISTINCT,因为无论如何输出都是唯一的。我倾向于同意上面的 Miika,但没有理由你原来的方法行不通。

苹果电脑

于 2012-04-20T09:36:57.630 回答
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
于 2012-04-20T07:49:01.127 回答