2

というテーブルがありますOrders。、、、、、、などの列idorderidあります。qtycostlocationcurrency

このオーダー テーブルの値を、特定の の別のテーブルに挿入する必要がorder idありますが、問題は にありcurrencyます。

それぞれについて、テーブルorderidには複数の行があり、各行には違いがあります。ordercurrency

したがって、このテーブルから a の新しい行を挿入するときorderidに、個別の通貨の数を取得し、最大数の通貨を挿入する必要があります。

列内の個別の値の数を比較するにはどうすればよいですか? これは SQL Server にあります。

4

5 に答える 5

2
with cte as
(
select orderid,currency, row_number() over
    (partition by orderid,currency order by orderid,currency) rownumber
  from orders 
)  

select cte.orderid,cte.currency 
from cte
join
(select orderid,max(rownumber) rownumber2
  from cte group by orderid) A
on cte.orderid=a.orderid and cte.rownumber=a.rownumber2

SQLFIDDLEのデモ:http ://sqlfiddle.com/#!3 / 1c046 / 25

サンプルデータを提供してくれたbluefeetに感謝します

于 2013-01-16T12:20:34.193 に答える
1

あなたの要件は正確には明確ではありませんが、次のようなものを使用できるようです:

select o.id,
  o.orderid,
  o.currency,
  o.cost
from orders o
inner join
(
  select orderid, currency,
    CountCurrency,
    max(CountCurrency) over(partition by orderid) mx
  from
  (
    select orderid, currency, count(currency) CountCurrency
    from orders
    group by orderid, currency
  ) o
) m
  on o.orderid = m.orderid
  and o.currency = m.currency
where m.CountCurrency = m.mx
order by o.orderid, o.id

デモで SQL Fiddle を参照してください

これにより、 で最も多く表示される通貨を含むすべての行が返されorderidます。サンプル データの使用:

CREATE TABLE orders
    ([id] int, [orderid] int, [currency] varchar(3), [cost] int)
;

INSERT INTO orders
    ([id], [orderid], [currency], [cost])
VALUES
    (1, 10, 'USD', 1000),
    (2, 10, 'EUR', 522),
    (3, 10, 'USD', 999),
    (4, 10, 'INR', 999),
    (5, 20, 'TST', 557),
    (6, 25, 'GRB', 24),
    (7, 20, 'TST', 78),
    (8, 30, 'HYT', 3)
;

結果は次のとおりです。

| ID | ORDERID | CURRENCY | COST |
----------------------------------
|  1 |      10 |      USD | 1000 |
|  3 |      10 |      USD |  999 |
|  5 |      20 |      TST |  557 |
|  7 |      20 |      TST |   78 |
|  6 |      25 |      GRB |   24 |
|  8 |      30 |      HYT |    3 |
于 2013-01-16T02:53:16.627 に答える
0

私が理解している限り、行を Orders から otherTable に移行し、さらに 2 つの列 (maxCurrency と totalDistinctCurrency) を含めますか?

私の理解が正しければ、次のようにすることができます:

INSERT INTO otherTable(
  maxCurrency, 
  totalDistinctCurrency, 
  otherColsFromOrders) 
SELECT 
  MAX(currency), 
  COUNT(DISTINCT currency), 
  * 
FROM Orders  
WHERE orderid = SOME_ORDER_ID_YOU_WANT;

次の 2 点に注意してください。

  1. 必要な orderid でSOME_ORDER_ID_YOU_WANTを変更できます。
  2. 選択時の * のため、otherColsFromOrders を、Orders テーブル内の列の順序と一致する otherTable 内の対応する列の名前に変更することができます。

それが役に立てば幸い!

于 2013-01-16T00:02:23.023 に答える
0

あなたの質問を正しく理解している場合Orders、特定のOrderId?

このようなもの - 複数の通貨が同じカウントで表される場合、複数のレコードを返す可能性がありますか?

SELECT MAX(c.CurrencyCount), c.currency
FROM 
(
    SELECT currency, Count(currency) as CurrencyCount
    FROM Orders
    WHERE OrderId = 12345
    GROUP BY currency
) c
GROUP BY c.currency
于 2013-01-15T23:22:55.893 に答える
0

もう1つのオプション

SELECT *
FROM Orders t
WHERE EXISTS(
             SELECT CASE WHEN MAX(COUNT(t2.currency)) OVER() = COUNT(t2.currency) THEN t2.currency END
             FROM Orders t2             
             WHERE t2.orderid = t.orderid            
             GROUP BY t2.currency
             INTERSECT
             SELECT t.currency
             )

SQLFiddle のデモ

于 2013-01-16T12:06:47.543 に答える