我需要加入两个表,其中第一个表中的每一行都得到第二个表中的每一行。
例子
表 1:InvoiceNo、产品代码、数量
表二:产品代号、产品名称
在表 1 I 中,对于每个发票记录,我只有一些产品,但在输出中,如果该产品未包含在发票中,我必须获取每张发票的所有产品,保持数量为 0。我怎样才能做到这一点?
您是否尝试过 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')
我不得不猜测您的表名,但我认为这可以按要求工作:
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