2017-02-07 11 views
0

SQL Serverでこれを行うことはできますか?最初のレコードで大文字と小文字を区別する場合は

ある列に同じproduct_idのレコードがあり、別の在庫(在庫あり)にYまたはNがあるテーブルから選択し、product_idが同じであるYを持つ最初のレコードを取って、別のテーブルのproduct_id_setと一致しています。

... , 
SELECT 
    (SELECT TOP 1 
     (product_name), 
     CASE 
      WHEN in_stock = 'Y' THEN product_name 
      ELSE product_name 
     END 
    FROM 
     Products 
    WHERE 
     Products.product_set = Parent_Table.product_set) AS 'Product Name',  
    ... 

サンプルデータは、例えば、 'ナシ' であろうproduct_set = 1から

product_set in_stock product_id product_name 
--------------------------------------------------- 
    1   N   12  Orange 
    1   Y   12  Pear 
    2   N   12  Apple 
    2   N   12  Lemon 

出力することになります。

+3

あなたの質問には多少の曖昧さがあります。私はあなたに正解を与えるために解決する必要があります。 in_stock値が 'Y'の製品IDのレコードがない場合は、何かが返されますか?第二に、in_stock 'Y'を持つ複数の行がある場合、どの行を選択するか気にしますか? – Xedni

答えて

1

したがって、次の質問に対する答えに応じて、2つの解決策があります。 in_stock値が 'Y'の製品IDのレコードがない場合は、何かが返されますか?第二に、in_stock 'Y'を持つ複数の行がある場合、どの行を選択するか気にしますか?

最初のソリューションは、ANY「Y」値があるかどうか、あなたが最初の行をしたいを前提としています。

select * 
from (select RID = row_number() over (partition by product_set order by in_stock desc) -- i.e. sort Y before N 
     from Products) a 
where a.RID = 1 

2番目の値は、少なくとも1つの行にin_stockの値が「Y」の場合にのみ値を返します。 order by (select null)は本質的に、複数のin_stockアイテムがある場合は、どちらが選択されても構わないと言っています。注文を気にする場合は、適切なソート条件に置き換えてください。

select * 
from (select RID = row_number() over (partition by product_set order by (select null)) -- i.e. sort Y before N 
     from Products 
     where in_stock = 'Y') a 
where a.RID = 1 

私はあなたのクエリで「親テーブル」の構造があるかわからないので、私はあなたが一人でProductsに必要なものを持っていると仮定して、それを簡略化してきました。

+0

完璧な感謝! – PeteTheGreek

0
SELECT ISNULL(
      (
       SELECT TOP 1 product_name 
       FROM Products 
       WHERE Products.product_set = Parent_Table.product_set 
         AND Products.in_stock = 'Y' 
      ), 'Not in the stock') AS 'Product Name' 
関連する問題