2

私は持っている

 select CustID,

case permission
When 'read' then 'X'
end as 'Read',

case permission
when 'write' then 'X'
end as 'Write',

case permission
when 'own' then 'X'
end as 'Own',

case permission
when ‘destroy’ then ‘X’
end as ‘Destroy’

from rights

group by custID, permission

custID ごとに 1 行だけ必要です。代わりに私は得る:

CustID    |  Read | Write |  Own | Destroy

208345482     X     NULL    NULL   NULL| 
208345482    NULL   NULL     X     NULL|
208345482    NULL   NULL    NULL      X|
208345482    NULL    X      NUL    NULL|
8093657522   NULL   NULL    NULL     X|
8093657522   NULL   NULL     X    NULL|

エイリアス サブクエリでグループ化しようとしましたが、役に立ちませんでした。どんな援助でも大歓迎です。

4

2 に答える 2

3

GROUP BYエイリアスが適用される前に解析されるため、エイリアスを使用することはできません。エイリアスを使用できる唯一の場所は句です。これは、エイリアスが定義さORDER BYれた後に解析される唯一の句であるためです。SELECT

GROUP BY一般的な回避策は、句で式を繰り返すことです。

SELECT x = CASE ... END, SUM(something)
  FROM dbo.somewhere
  GROUP BY CASE ... END;

またはCTEを使用して:

;WITH src AS
(
  SELECT x = CASE ... END, something
    FROM dbo.somewhere
)
SELECT x, SUM(something)
  FROM src
  GROUP BY x;

またはサブクエリを使用します。

SELECT x, SUM(something)
  FROM
  (
    SELECT x = CASE ... END, something
      FROM dbo.somewhere
  ) AS src
  GROUP BY x;

これらはすべて同様に最適化する必要がありますが、特定のシナリオをテストして確認する必要があります。

あなたの場合、これを次のように書くことができます:

SELECT CustID,
  [Read]    = MAX(CASE permission WHEN 'read'    THEN 'X' END),
  [Write]   = MAX(CASE permission WHEN 'write'   THEN 'X' END),
  [Own]     = MAX(CASE permission WHEN 'own'     THEN 'X' END),
  [Destroy] = MAX(CASE permission WHEN 'destroy' THEN 'X' END)
FROM dbo.rights
GROUP BY custID;

またはこのように:

SELECT CustID,
  MAX([Read]), MAX([Write]), MAX([Own]), MAX([Destroy])
FROM
(
  SELECT CustID,
   [Read]    = CASE permission WHEN 'read'    THEN 'X' END,
   [Write]   = CASE permission WHEN 'write'   THEN 'X' END,
   [Own]     = CASE permission WHEN 'own'     THEN 'X' END,
   [Destroy] = CASE permission WHEN 'destroy' THEN 'X' END
  FROM dbo.rights
) AS src
GROUP BY custID;

列またはテーブルを区切るために単一引用符を使用しないでください'alias'。構文が廃止されるだけでなく、エンティティが文字列リテラルのように見えます。エスケープする必要がある場合 (たとえば、不適切な列名を選択した場合)、 を使用します[square brackets]

于 2013-03-20T00:29:35.980 に答える
0

これらの式の代わりにテーブル演算子を使用PIVOTして、1 つのクエリで直接行うことができますCASE

これは、式を使用して展開した後のレコードのグループ化である、探している次のステップを実行しますCASE。何かのようなもの:

SELECT 
  CustId, 
  read, 
  write, 
  own, 
  Destroy
FROM
( 
   SELECT custid, permission, x
   FROM tablename
) AS t
PIVOT
(
   MAX(x)
   FOR permission IN('read', 
                     'write', 
                     'own', 
                     'Destroy')
) AS p;

クエリで、xが識別子ではなく文字列リテラルである場合は、通常、アンカー クエリでエイリアスを使用して文字列リテラルとして選択でき、SELECT custid, permission, 'x' AS x FROM tablename上記のクエリは正常に機能するはずです。

于 2013-03-20T00:35:07.860 に答える