16

私の問題のサンプルシナリオをまとめました。誰かが私を正しい方向に向けるのに十分であることを願っています.

私は2つのテーブルを持っています

製品

代替テキスト

製品メタ

代替テキスト

次の結果セットが必要です

代替テキスト

4

4 に答える 4

24

これは2年前のものだと思いますが、受け入れられた回答では動的SQLを使用する必要があり、最も支持された回答が機能しないことに悩まされています。

Select P.ProductId, P.Name
    , Min( Case When PM.MetaKey = 'A' Then PM.MetaValue End ) As A
    , Min( Case When PM.MetaKey = 'B' Then PM.MetaValue End ) As B
    , Min( Case When PM.MetaKey = 'C' Then PM.MetaValue End ) As C
From Products As P
        Join ProductMeta As PM
            On PM.ProductId = P.ProductId
Group By P.ProductId, P.Name

Group By を使用する必要があります。そうしないと、ずらした結果が得られます。Group By を使用している場合は、Group By 句にない各列を集計関数 (またはサブクエリ) でラップする必要があります。

于 2011-04-27T05:23:01.597 に答える
14

過去に次のアプローチを使用して成功しました...

SELECT [p].ProductID,
       [p].Name,
       MAX(CASE [m].MetaKey
             WHEN 'A'
               THEN [m].MetaValue
           END) AS A,
       MAX(CASE [m].MetaKey
             WHEN 'B'
               THEN [m].MetaValue
           END) AS B,
       MAX(CASE [m].MetaKey
             WHEN 'C'
               THEN [m].MetaValue
           END) AS C
FROM   Products [p]
       INNER JOIN ProductMeta [m]
         ON [p].ProductId = [m].ProductId
GROUP  BY [p].ProductID,
          [p].Name 

を使用して集計を転置することも役立ちます...

SUM(CASE x WHEN 'y' THEN yVal ELSE 0 END) AS SUMYVal

編集

また、これはANSI標準SQLを使用しているため、プラットフォーム間で機能することに注意してください:)

于 2008-11-28T16:53:34.173 に答える
6

データベースエンジンが2005で、データベースが2000互換モードの場合、2005データベースからクエリを実行することで、互換性の低いモードを回避できます。次のようなクエリでテーブルに3つの部分の命名規則を使用して、2000データベースをターゲットにします。DatabaseNameHere.dbo.TableNameHere

于 2010-03-31T21:12:52.880 に答える
3
Select a.ProductId
  ,a.Name
  ,(Select c.MetaValue
    From [Product Meta] c
    Where c.ProductId = a.ProductId
    And c.MetaKey = 'A') As 'A'
   ,(Select d.MetaValue
    From [Product Meta] d
    Where d.ProductId = a.ProductId
    And d.MetaKey = 'B') As 'B'
   ,(Select e.MetaValue
      From [Product Meta] e
      Where e.ProductId = a.ProductId
      And e.MetaKey = 'C') As 'C'
From Products a
Order By a.ProductId Asc
于 2008-11-23T20:03:56.833 に答える