0

サブクエリの結果を結果セットに返すクエリを作成しようとしています。

私が使用しているテーブルは次のとおりです。

Orders       OrderDetails     
-------      -----------     
orderId      orderDetailId         
(other data) orderId
             productName     

各注文の最初の 2 つの注文詳細を取得したいと考えています (ほとんどの注文には 1 つまたは 2 つの詳細しかありません)。目的の結果セットの例を次に示します。

orderId   (other order data)   productName1   productName2
-------   ------------------   ------------   ------------
1         (other order data)   apple          grape
2         (other order data)   orange         banana
3         (other order data)   apple          orange

これは私がこれまでに試したことです:

SELECT o.orderid, 
       Max(CASE WHEN detail = 1 THEN oi.productname END) AS ProductName1, 
       Max(CASE WHEN detail = 2 THEN oi.productname END) AS ProductName2 
FROM orders AS o 
    OUTER apply (SELECT TOP 2 oi.*, 
                     Row_number() OVER (ORDER BY orderdetailid) AS detail 
                FROM orderdetails AS oi 
                WHERE oi.orderid = o.orderid) AS oi 
GROUP BY o.orderid 

ホストされた e コマース ソリューションのカスタム レポート モジュールでこれを実行すると、次の役に立たない構文エラーが発生します: SQL エラー: '(' 付近の構文が正しくありません。

残念ながら、使用している SQL Server のバージョンがわかりません。カスタマー サポートは何も知らず、@@Version を選択しても機能しません。

エラー メッセージが名前で関数を参照している場合でも、row_number() 関数は適切にサポートされていないようです。

助けてくれてありがとう!

4

2 に答える 2

0

製品を選択するだけの場合はorderid、結合はまったく必要ありません。

select orderid, productcode
from (SELECT oi.orderid, oi.productcode,
             row_number() over (partition by oi.orderid order by oi.orderdetailid) as seqnum
      FROM orderdetails oi
     ) oi
where seqnum = 1;

が機能していない場合、これで問題が解決しない可能性がありますrow_number()が、クエリが簡素化されます。min()メソッドでもこれを行うことができます:

select orderid, productcode
from orderdetails oi
where oi.orderdetailid in (select min(orderdetailid) from orderdetails group by orderid);
于 2013-08-24T14:48:15.590 に答える
0

クロス適用を使用しない代替方法を次に示します。あなたのランキングは正しかったのですが、順番にパーティションを追加しました。

SELECT 
*
FROM
(
    SELECT
        o.orderid,
        ProductName=oi.productcode, 
        RowNumber=ROW_NUMBER() OVER (PARTITION BY o.orderid ORDER BY oi.orderdetailid) 
    FROM
        orders as o
        INNER JOIN orderdetailid oi ON oi.orderid=o.orderid
)AS X
WHERE
    RowNumber=1

row_number を使用せずに

SELECT
    orderdetails.*
    Q1.* 
FROM
(   
    SELECT 
        o.*, 
        FirstOrderDetailID=(SELECT MIN(orderdetails.orderdetailsid) FROM orderdetails WHERE orderid=o.orderid)
    FROM
        orders o    
)AS Q1     
LEFT OUTER JOIN orderdetails oi ON oi.orderdetailsid=Q1.FirstOrderDetailID     
于 2013-08-24T13:41:09.140 に答える