0

我需要加入两个表,其中第一个表中的每一行都得到第二个表中的每一行。

例子

表 1:InvoiceNo、产品代码、数量

表二:产品代号、产品名称

在表 1 I 中,对于每个发票记录,我只有一些产品,但在输出中,如果该产品未包含在发票中,我必须获取每张发票的所有产品,保持数量为 0。我怎样才能做到这一点?

4

2 回答 2

1

您是否尝试过 CROSS JOIN - 这会为每个 Invoice (table2) 生成 Product (table1) 中的所有行。然后您可以 INNER JOIN 到发票行表以获取总计。

这是你需要的吗?

http://sqlfiddle.com/#!3/e2f66/4

更新:

(哎呀)当我说 INNER 加入时,我的意思是 LEFT,否则你会消除空值 :)

更新:

需要添加分组并添加到join中以确保lines产品代码被join到products表中

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 回答
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

编辑

要以您需要使用条件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

我在SQL Fiddle上放了一些使用 SQL-Server 2008R2 的例子

于 2012-06-12T09:42:16.313 回答