0

最初のテーブルの各行が2番目のテーブルのすべての行を取得する2つのテーブルを結合する必要があります。

表1:InvoiceNo、製品コード、数量

表2:製品コード、製品名

表1Iでは、請求書レコードごとに一部の製品しかありませんが、出力では、各請求書のすべての製品を取得して、その製品が請求書に含まれていない場合は数量を0に保つ必要があります。これどうやってするの?

4

2 に答える 2

1

私はあなたのテーブル名を推測しなければなりませんでしたが、これは必要に応じて機能すると思います:

SELECT  InvoiceNo, 
        ProductName, 
        SUM(CASE WHEN Invoice.ProductCode = Product.ProductCode THEN Quantity ELSE 0 END) AS Quantity
FROM    Invoice, Product
GROUP BY InvoiceNo, ProductName

編集

SUMSQL-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を使用した例をいくつか示しました

于 2012-06-12T09:42:16.313 に答える
1

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')
于 2012-06-12T09:37:12.853 に答える