0

Select発言あり

    Select i.ItemID, s.Price, s.Qty, s.Company From Item i
    Inner Join Sku s ON s.ItemID = i.ItemID

これはこれを返します:

ItemID  |   Price   |   Qty |   Company
    1   |   $50.00  |   0   |   Abc inc.
    1   |   $45.00  |   5   |   Def inc.
    1   |   $35.00  |   15  |   Xyz inc.

    2   |   $36.00  |   4   |   Abc inc.
    2   |   $45.00  |   5   |   Def inc.
    2   |   $35.00  |   1   |   Xyz inc.

    3   |   $20.00  |   2   |   Abc inc.
    3   |   $45.00  |   0   |   Def inc.
    3   |   $35.00  |   5   |   Xyz inc.

ただし、次のロジックが必要です。

その結果を参照している会社を含め、価格と数量が 0 より大きい行を表示します。

そうしないと...

その価格を参照している会社を含め、最低価格の行を表示します。

これは次のようになります。

ItemID  |   Price  |    Qty |   Company
    1   |   $35.00  |   15  |   Xyz inc.

    2   |   $35.00  |   1   |   Xyz inc.

    3   |   $20.00  |   2   |   Abc inc.

正直なところ、何を試すべきか、質問で何を尋ねるべきかさえわからないため、何も試していません。助言がありますか?

4

6 に答える 6

1

これを行う1つの方法は次のとおりです。

SELECT      I.ItemId
        ,   S.Price
        ,   S.Qty
        ,   S.Company
FROM        dbo.Item    I
CROSS APPLY (
                SELECT  MIN(Price)  Price
                FROM    dbo.Sku     MP
                WHERE   I.ItemId    = MP.ItemId
                AND     Qty         > 0
            ) MP
CROSS APPLY (
                SELECT 
                TOP 1   Price
                    ,   Qty
                    ,   Company
                FROM    dbo.Sku     S
                WHERE   S.ItemId    = I.ItemId
                AND     S.Price     = MP.Price
            ) S
于 2012-04-24T05:36:39.580 に答える
1

行番号を使用すると、次のようになります。

select 
    i.ItemId, s.Price, s.Qty, s.Company 
from
    item i
inner join
    (
        select 
            t.ItemId,
            t.Price, 
            t.Qty, 
            t.Company, 
            RowNumber = row_number() over (PARTITION BY t.ItemId order by t.price asc, t.qty desc)
        from 
            Sku t
    ) s on s.itemid = i.ItemId
where 
    s.RowNumber = 1

行番号の「partition by」と「order by」は、正しい結果を保証するためにここで重要です。これは、アイテムのすべての数量が 0 の場合でも機能します。

于 2012-04-24T06:14:32.640 に答える
0
Select i.ItemID, Min(s.Price) as Price, s.Qty, s.Company 
From Item i Inner Join Sku s ON s.ItemID = i.ItemID 
Where s.qty > 0 
Group by i.itemid, s.qty, s.Company 
于 2012-04-24T05:19:09.463 に答える
0

クエリは次のとおりです。

Select i.ItemID, s.Price, s.Qty, s.Company 
From Item i
Inner Join Sku s
  ON s.ItemID = i.ItemID
Inner Join (
    select min(price) as Price, ItemID
    from Sku
    where Qty > 0
    group by ItemId
  )a
on a.ItemId = s.ItemId
and a.Price = s.Price

Item テーブルから ItemId のみが必要な場合は、ItemId が Sku に存在するため、Item テーブル自体との結合を削除できます。

于 2012-04-24T05:19:48.743 に答える
0
Select i.ItemID, min(s.Price) as price, s.Qty, s.Company From Item i 
Inner Join Sku s ON s.ItemID = i.ItemID  and s.qty>0
group by i.itemid, s.company, s.qty
于 2012-04-24T05:19:59.273 に答える
0

基本的には、最初の sku レコードが必要です。最初に在庫があるかどうか (在庫のあるアイテムが最初に表示されます) で並べ替えられ、次に価格で昇順に並べられます。次のクエリでは、共通テーブル式が必要な SKU フィールドと RowNum 計算フィールドを返します。RowNum は ItemID によって分割され (つまり、新しい ItemID ごとに 1 にリセットされます)、最初に在庫の有無によって並べ替えられ、次に価格によって並べ替えられます。メイン クエリは、各 ItemID から最初のレコードを選択します。

WITH cte AS (
    SELECT ItemID, Price, Qty, company,
    ROW_NUMBER() OVER (PARTITION BY ItemId ORDER BY 
        CASE WHEN Qty > 0 THEN 1 ELSE 0 END DESC, Price ASC) AS RowNum
    FROM #sku
    )
SELECT ItemID, price, qty, Company FROM cte WHERE RowNum = 1
于 2012-04-24T10:14:19.293 に答える