2

そうでなければ複雑な結合の小さな部分を解決しようとして立ち往生しています。

「指示」テーブルと「見積もり」テーブルがあります。「見積もり」にはestimates、特定の命令のさまざまなタイプの複数の行があります。

指示表

id | address | status
1 | 27 TAYLOR ROAD, ALBION PARK NSW 2527 | InProgress

見積もり表

id | instruction_id | basis | basis_date | basis_value
1 | 1 | ContractPrice | 2012-04-05 | 124000
2 | 1 | CAMV | 2012-02-01 | 120000
3 | 1 | CustomerEstimate | 2012-06-07 | 132000
4 | 1 | ContractPrice | 2013-01-03 | 140000
5 | 1 | CustomerEstimate | 2013-02-09 | 145000

私たちが望むのは、実際には、1) 最新の 'CustomerEstimate' (basis_date とbasis_value を Estimate_date と Estimate_value としてエイリアス化) と 2) の instruction.id = Estimation.instruction_id と assessment.basis に基づく 'estimates' の 'instructions' の 2 つの結合です。最新の 'ContractPrice' (ここでも、basis_date と basic_value を contact_date と contract_value としてエイリアシングします)。

意図した結果は次のようになります。

id | address | status | contract_price | contract_date | estimate_date | estimate_value
1 | 27 TAYLOR ROAD, ALBION PARK NSW 2527 | InProgress | 2013-01-03 | 140000 | 2013-02-09 | 145000

そこにいる SQL の専門家からの支援に本当に感謝しています。

どうもありがとう、トレント。

4

2 に答える 2

1

試す

SELECT i.id,  
       i.address, 
       i.status,
       p.max_date contract_date, 
       p.basis_value contract_price, 
       e.max_date estimate_date, 
       e.basis_value estimate_value
  FROM Instructions i LEFT JOIN
(
    SELECT q1.instruction_id, max_date, basis_value
      FROM Estimates e JOIN
    (
        SELECT instruction_id, MAX(basis_date) max_date
          FROM Estimates
         WHERE basis = 'CustomerEstimate'
         GROUP BY instruction_id
    ) q1 ON e.instruction_id = q1.instruction_id AND e.basis_date = q1.max_date
) e ON i.id = e.instruction_id LEFT JOIN
(
    SELECT q2.instruction_id, max_date, basis_value
      FROM Estimates e JOIN
    (
        SELECT instruction_id, MAX(basis_date) max_date
          FROM Estimates
         WHERE basis = 'ContractPrice'
         GROUP BY instruction_id
    ) q2 ON e.instruction_id = q2.instruction_id AND e.basis_date = q2.max_date
) p ON i.id = p.instruction_id

出力:

| | ID | 住所 | ステータス | CONTRACT_PRICE | CONTRACT_DATE | ESTIMATE_VALUE | ESTIMATE_DATE |
-------------------------------------------------- -------------------------------------------------- ------------------------
| | 1 | 27 テイラー ロード、アルビオン パーク NSW 2527 | 進行中 | 140000 | 2013-01-03 | 145000 | 2013-02-09 |

これがSQLFiddle のデモです。

于 2013-06-23T06:31:42.223 に答える
0

ここのcontract_priceはいくらですか? 以下を試すことができます

select inst.id
     , inst.address
     , inst.status
     , est.basis_value as estimate_value
     , est.basis_date as estimate_date 
  from instructions inst
     , estimates est 
 where inst.id=est.instruction_id 
   and (est.basis='CustomerEstimate' or est.basis='ContractPrice') 
 order 
    by est.basis
     , est.basis_date desc;
于 2013-06-23T06:22:55.953 に答える