3

以下の select ステートメントを確認してください。

  SELECT 
    fc.flavorid,
    fc.flavorname,
    CASE 
      WHEN sa.flavorid IS NULL THEN 'No'
      ELSE 'Yes' END ) IsEaten
    CASE 
      WHEN t.tempid IS NULL THEN 'No' 
      ELSE 'Yes' END ) IsWarm

  FROM [poptart] p

    LEFT JOIN [diet] d ON d.Active = 1
    LEFT JOIN [toaster] ts ON p.poptartid = ts.poptartid AND d.dietname = ts.dietname
    LEFT JOIN [flavor] fl ON fl.poptartid = ts.poptartid
    LEFT JOIN [flavorcolor] fc ON fc.flavorid = fl.flavorid

    LEFT OUTER JOIN [stomach] sa ON sa.flavorid = fc.flavorid

    LEFT JOIN [poptart] p2 ON ts.poptartid = p2.poptartid
    LEFT JOIN [temp] t ON t.tempid = p2.tempid AND t.Active = 1

  GROUP BY fc.flavorid,fc.flavorname,sa.flavorid,t.tempid
  ORDER By fc.flavorname

以下に示すように、これは「berry」の「IsWarm」値ごとに 1 つを返します。このリストで個別のフレーバー名のみを返したいのですが、「IsWarm」フィールドが問題になります。これは、Yes または No になる可能性があり、Yes と No ではなく、Yes が利用可能な場合にのみ Yes を表示したいので、そうではありません。 「berry」のように、重複するフレーバー名をプルします。

    flavorid  |  flavorname  |  IsEaten  |  IsWarm
      123     |    berry     |    No     |   Yes
      123     |    berry     |    No     |   No
      234     |    fudge     |    Yes    |   No
      235     |    honey     |    No     |   No

このステートメントがこれだけを返すようにするにはどうすればよいですか?

  flavorid  |  flavorname  |  IsEaten  |  IsWarm
    123     |    berry     |    No     |   Yes
    234     |    fudge     |    Yes    |   No
    235     |    honey     |    No     |   No

助言がありますか?

4

1 に答える 1

3

これを試して:

;WITH FlavorsList
AS
( 
    //Your query here
    SELECT 
      fc.flavorid,
      fc.flavorname,
    CASE 
      WHEN sa.flavorid IS NULL THEN 'No'
      ELSE 'Yes' END ) IsEaten
    CASE 
      WHEN t.tempid IS NULL THEN 'No' 
      ELSE 'Yes' END ) IsWarm

  FROM [poptart] p

    LEFT JOIN [diet] d ON d.Active = 1
    LEFT JOIN [toaster] ts ON p.poptartid = ts.poptartid 
                           AND d.dietname = ts.dietname
    LEFT JOIN [flavor] fl ON fl.poptartid = ts.poptartid
    LEFT JOIN [flavorcolor] fc ON fc.flavorid = fl.flavorid

    LEFT OUTER JOIN [stomach] sa ON sa.flavorid = fc.flavorid

    LEFT JOIN [poptart] p2 ON ts.poptartid = p2.poptartid
    LEFT JOIN [temp] t ON t.tempid = p2.tempid AND t.Active = 1

  GROUP BY fc.flavorid,fc.flavorname,sa.flavorid,t.tempid
)
SELECT fl.flavorid, fl.flavorname, fl.IsEaten, Max(fl.IsWarm)
FROM FlavorsList fl
GROUP BY fl.flavorid, fl.flavorname, fl.IsEaten
ORDER BY fl.flavorname

ここで行ったことはGROUP、最初のクエリの結果を取得するクエリで結果をラップすることBY flavorid, flavorname, IsEatedです。MAX(IsWarm)集計関数として使用すると、vlafors 名のIsWarm値が保持されます。DISTINCTこのクエリは単純化と読みやすさのためにCTEを使用して作成しましたが、ネストされたクエリとして作成することもできます。

于 2012-04-21T05:44:22.490 に答える