4

私はこれを理解しようとしばらく試みてきましたが、より高度な SQL スキルが不足しているため、私は足を引っ張っています。

Executions(TradeDate, Symbol, Side, Price, Under, Account)

TEMP DATA:
2012-06-20, AAPL 120716C00600000, BUY, 3.25, AAPL, XYZ123
2012-06-20, AAPL 120716C00600000, SELL, 3.30, AAPL, XYZ123
2012-06-20, AAPL 120716C00600000, BUY, 3.25, AAPL, XYZ123
2012-06-20, AAPL 120716C00600000, SELL, 3.30, AAPL, XYZ123
2012-06-20, GRPN 120716C00027000, BUY, 2.25, GRPN, XYZ123
2012-06-20, GRPN 120716C00027000, SELL, 2.30, GRPN, XYZ123
2012-06-20, GRPN 120716C00027000, SELL, 2.30, GRPN, XYZ123
2012-06-20, GRPN 120716C00027000, BUY, 2.25, GRPN, XYZ123


-UNDER----Side(Buy)----Side(Sell)
 AAPL      6.50         6.60
 GRPN      4.50         4.60

ご覧のとおり、各サイドの価格の合計を取得し、アンダーでグループ化しようとしています。

4

4 に答える 4

6

列ごとGROUP BYにグループ化し、必要な結果を得るために関連付けるために使用します。UnderCASESUM

SELECT e.Under,
       SUM(case when e.Side = 'BUY' them e.Price else 0 end) as 'Side(Buy)',
       SUM(case when e.Side = 'SELL' them e.Price else 0 end) as 'Side(Sell)'
FROM Executions e
GROUP BY e.Under
于 2012-06-26T14:51:19.817 に答える
3

これにはPIVOTを使用できます。(デモについては SQL Fiddle を参照してください)

select *
from 
(
    select under, price, side
    from executions
) x
PIVOT
(
    sum(price)
    for side in ([BUY], [SELL])
) p
于 2012-06-26T14:53:24.617 に答える
0

1 つのアプローチを次に示します。

SELECT e.under
     , SUM(CASE WHEN e.side = 'BUY'  THEN e.price ELSE NULL END) AS [Side(Buy)]
     , SUM(CASE WHEN e.side = 'SELL' THEN e.price ELSE NULL END) AS [Side(Sell)]
  FROM Executions e
 GROUP BY e.under

ここでの「トリック」は、CASE 式を使用して、side の特定の値に対してのみ Price を返すことです。(注: 誰かが必然的に指摘するように、ELSE NULL は暗黙的であり、省略できます。)

これが唯一のアプローチではありません。ただし、たとえば、各合計に含まれる行の「カウント」とすべての行のカウントも取得する必要がある場合は、非常にうまく機能する柔軟なアプローチです。このアプローチが実行されていることを説明するには、次のようにします。

 SELECT e.under
     , SUM(CASE WHEN e.side = 'BUY'  THEN e.price ELSE NULL END) AS [SUM_Side(Buy)]
     , SUM(CASE WHEN e.side = 'BUY'  THEN 1       ELSE 0    END) AS [COUNT_Side(Buy)]
     , SUM(CASE WHEN e.side = 'SELL' THEN e.price ELSE NULL END) AS [SUM_Side(Sell)]
     , SUM(CASE WHEN e.side = 'SELL' THEN 1       ELSE 0    END) AS [COUNT_Side(Sell)]
     , SUM(CASE WHEN e.side IN ('BUY','SELL') THEN 1 ELSE 0 END) AS [COUNT_(Buy+Sell)]
  FROM Executions e
 GROUP BY e.under

このアプローチは通常、パフォーマンスが非常に予測可能であり、ソース データセットを 1 回だけ参照する必要があります (この場合は単純なテーブル参照)。

このアプローチは、ほぼすべてのリレーショナル データベースで機能します。(Oracle、SQL Server、MySQL、Teradata、DB2、...)

于 2012-06-26T14:52:10.720 に答える
0
 select Symbol, sum(case when side = 'BUY' THEN Price else 0 END) as [Side(Buy)], sum(case when side = 'SELL' THEN Price else 0 END) as [Side(Sell)] group by Symbol
于 2012-06-26T14:52:14.907 に答える