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

それ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 に答える
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 に答える