最初のテーブルの各行が2番目のテーブルのすべての行を取得する2つのテーブルを結合する必要があります。
例
表1:InvoiceNo、製品コード、数量
表2:製品コード、製品名
表1Iでは、請求書レコードごとに一部の製品しかありませんが、出力では、各請求書のすべての製品を取得して、その製品が請求書に含まれていない場合は数量を0に保つ必要があります。これどうやってするの?
私はあなたのテーブル名を推測しなければなりませんでしたが、これは必要に応じて機能すると思います:
SELECT InvoiceNo,
ProductName,
SUM(CASE WHEN Invoice.ProductCode = Product.ProductCode THEN Quantity ELSE 0 END) AS Quantity
FROM Invoice, Product
GROUP BY InvoiceNo, ProductName
編集
SUM
SQL-Server CEがサポートしているとは思わないので、条件付きを使用する必要がありますPIVOT
。このようなものがあなたのために働くでしょう:
SELECT InvoiceNum,
SUM(CASE WHEN ProductCode = 'P1' THEN Quantity ELSE 0 END) [Product 1],
SUM(CASE WHEN ProductCode = 'P2' THEN Quantity ELSE 0 END) [Product 2],
SUM(CASE WHEN ProductCode = 'P3' THEN Quantity ELSE 0 END) [Product 3]
FROM Invoice
GROUP BY InvoiceNum
ただし、これは、コードの作成時に使用しているすべての製品を知っている場合にのみ機能します。これが変更される可能性がある場合は、動的SQLを使用して上記のクエリを作成できますが、製品をその場で追加するため、新しい製品が追加されたときにクエリを変更する必要はありません。私はこれをCEでテストしていませんが、機能しない理由はわかりません。
DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL = COALESCE(@SQL, '') + ', SUM(CASE WHEN ProductCode = ''' + ProductCode + ''' THEN Quantity ELSE 0 END) ' + QUOTENAME(ProductName)
FROM Product
SET @SQL = N'SELECT InvoiceNum' + @SQL + N'FROM Invoice GROUP BY InvoiceNum'
EXECUTE SP_EXECUTESQL @SQL
SQLFiddleでSQL-Server2008R2を使用した例をいくつか示しました。
CROSS JOIN を試しましたか?これにより、各請求書 (テーブル 2) の製品 (テーブル 1) からすべての行が生成されます。次に、請求書明細テーブルに内部結合して合計を取得できます。
これはあなたが必要とするものですか?
http://sqlfiddle.com/#!3/e2f66/4
アップデート:
(おっと) INNER 結合と言ったときは、LEFT を意味します。それ以外の場合は、null を削除します :)
アップデート:
行の製品コードが製品テーブルに結合されたことを確認するために、グループ化を追加して結合に追加する必要があります
http://sqlfiddle.com/#!3/e2f66/14
次の結果が得られます。
INVOICENO PRODUCTCODE QUANTITY
INV0001 PROD01 1
INV0001 PROD02 2
INV0001 PROD03 0
INV0002 PROD01 0
INV0002 PROD02 0
INV0002 PROD03 0
INV0003 PROD01 0
INV0003 PROD02 0
INV0003 PROD03 0
もちろん、これは次のデータに基づいています。
CREATE TABLE InvoiceHeader
(
InvoiceNo varchar(10)
)
CREATE TABLE InvoiceLines
(
InvoiceNo varchar(10),
ProductCode varchar(10),
Quantity int
)
CREATE TABLE Products
(
ProductCode varchar(10)
)
INSERT INTO InvoiceHeader VALUES ('INV0002')
INSERT INTO InvoiceHeader VALUES ('INV0001')
INSERT INTO InvoiceHeader VALUES ('INV0003')
INSERT INTO InvoiceLines VALUES ('INV0001', 'PROD01', 1)
INSERT INTO InvoiceLines VALUES ('INV0001', 'PROD02', 2)
INSERT INTO Products VALUES ('PROD01')
INSERT INTO Products VALUES ('PROD02')
INSERT INTO Products VALUES ('PROD03')