0

だから私はしばらくここをいじっていましたが、まだこれを理解することができず、最終的に推測方法を試すことをあきらめ、助けを求めています.

データベースに 3 つのテーブルがあります。1 つは請求書レベルの詳細 (顧客、請求書の配送料、支払いなど) を追跡し、もう 1 つは品目の詳細 (注文の品目、コスト/品目、販売価格/品目など) を追跡し、最後のテーブルは出荷 EG に関するデータを保持します。 : 追跡番号、送料などの費用。

ので、私は持っています:

CustomerInvoice
CustomerInvoiceDetail
Shipment

これらのテーブルを結合する単一の選択ステートメントで終わろうとしていますが、出荷テーブルと照合されたときに請求書の詳細を繰り返さないでください。CustomerInvoice は、CustomerInoiceDetail と Shipment の両方と 1 対多の関係を持ちます。これは、注文が複数の項目と複数の出荷を持つことができるためです。

これまでのところ、私は持っています:

SELECT     
    CustomerInvoice.InvoiceCode, CustomerInvoiceDetail.ItemCode,
    CustomerInvoiceDetail.LineNum, Shipment.SourceDocument, 
    Shipment.TrackingNumber, CustomerInvoiceDetail.ActualCost, 
    CustomerInvoiceDetail.ExtActualCost, Shipment.Freight AS FreightCost,
    CustomerInvoiceDetail.SalesPrice, CustomerInvoiceDetail.ExtPrice, 
    CustomerInvoiceDetail.SalesTaxAmount, CustomerInvoice.Freight, 
    CustomerInvoice.FreightTax

FROM         
    CustomerInvoiceDetail LEFT OUTER JOIN
                  Shipment RIGHT OUTER JOIN
                  CustomerInvoice 
    ON Shipment.SourceDocument = CustomerInvoice.SourceInvoiceCode 
    ON CustomerInvoiceDetail.InvoiceCode = CustomerInvoice.InvoiceCode
;

理想的には、出荷と注文レベルの詳細を含む行を表示し、請求書の明細の詳細を表示せず、その下にすべての請求書の明細の詳細を表示する結果が必要です。これは、請求書を出荷に内部結合することで実行できると考えていましたが、請求書の詳細からすべての行を任意の基準で他のデータに結合せずにさらに含める方法がわかりません。最終的に必要なのは、最終結果に任意の注文に対して同じ金額が複数回含まれないようにすることです。

参考までに、Gordon Linoff から提出されたクエリを完全な構文で書き直して実行しました。奇妙なことに、現在のところ case ステートメントに問題があるだけです。これは次のようになります。

`--REFERENCE JOIN STATEMENT          
SELECT CustomerInvoice.InvoiceCode, NULL as ItemCode,
       NULL as LineNum, Shipment.SourceDocument, 
       Shipment.TrackingNumber, NULL as ActualCost, 
       NULL as ExtActualCost, Shipment.Freight AS FreightCost,
       NULL as SalesPrice, NULL as ExtPrice, 
       NULL as SalesTaxAmount, CustomerInvoice.Freight, 
       CustomerInvoice.FreightTax
FROM Shipment RIGHT OUTER JOIN
     CustomerInvoice
    ON Shipment.SourceDocument = CustomerInvoice.SourceInvoiceCode 
union all
select CustomerInvoice.InvoiceCode, CustomerInvoiceDetail.ItemCode,
       CustomerInvoiceDetail.LineNum, NULL as SourceDocument, 
       NULL as TrackingNumber, CustomerInvoiceDetail.ActualCost, 
       CustomerInvoiceDetail.ExtActualCost, NULL AS FreightCost,
       CustomerInvoiceDetail.SalesPrice, CustomerInvoiceDetail.ExtPrice, 
       CustomerInvoiceDetail.SalesTaxAmount, CustomerInvoice.Freight, 
       CustomerInvoice.FreightTax
from CustomerInvoice join
     CustomerInvoiceDetail
     on CustomerInvoice.InvoiceCode = CustomerInvoiceDetail.InvoiceCode
order by InvoiceCode, ItemCode, (case when LineNum is null then 0 else 1 end), LineNum

_`
4

1 に答える 1

0

異なる行に異なる情報を持つこのタイプのクエリは、通常、union. 以下は、おそらく必要なものの例です。

SELECT ci.InvoiceCode, ci.ItemCode,
       NULL as LineNum, S.SourceDocument, 
       s.TrackingNumber, NULL as ActualCost, 
       NULL as ExtActualCost, s.Freight AS FreightCost,
       NULL as SalesPrice, NULL as ExtPrice, 
       NULL as SalesTaxAmount, ci.Freight, 
       ci.FreightTax
FROM Shipment s RIGHT OUTER JOIN
     CustomerInvoice ci
    ON s.SourceDocument = ci.SourceInvoiceCode 
union all
select ci.InvoiceCode, ci.ItemCode,
       cid.LineNum, NULL as SourceDocument, 
       NULL as TrackingNumber, cid.ActualCost, 
       cid.ExtActualCost, NULL AS FreightCost,
       cid.SalesPrice, cid.ExtPrice, 
       cid.SalesTaxAmount, ci.Freight, 
       ci.FreightTax
from CustomerInvoice ci join
     CustomerInvoiceDetail cid
     on ci.InvoiceCode = cid.InvoiceCode
order by InvoiceCode, ItemCode, (case when lineNum is null then 0 else 1 end), LineNum

caseステートメントはorder by、NULL LineNum を持つ行が最初になるようにするためのものです。

注: これはテストされていない SQL であるため、特にエイリアスで構文エラーが発生する可能性があります。

于 2013-01-12T19:00:32.157 に答える