这是我的第一个问题,如果我的问题看起来有问题,请原谅。虽然我对ms access数据库有一些了解,但我对编程和SQL都是全新的。
我创建了两个表OrdersTabel
和OrderedItems
。然后我想创建另一个表OrderFullDetails
,如下面的屏幕截图所示:
我想创建OrderFullDetails
表,如下所示。
Item
表中的OrderedItem
列中的包含应在OrderFullDetails
表中按名称创建单独的列。
如果OrderFullDetails
表中已存在的列等于OrderedItem
表中的项目名称,则只应根据OrderNo将Qty
值输入到匹配列。如果没有列匹配,则应创建一个新列。
你的帮助对我来说将是万元。
由于
答案 0 :(得分:2)
首先欢迎来到Stack Overflow。通常在询问问题时,您应该展示自己是如何尝试自己解决问题的。此外,我们不喜欢图片,并且更喜欢以一种易于我们复制的格式提供一些样本数据。请注意,SO不是编码服务。但是,因为这是你第一次,我会很善良的。
违反关系数据库设计的常规规则,构建第三个表来保存已经存放在其他表中的数据。您应该做的是创建一个存储过程,以您希望的格式从两个表中检索记录。正如scsimon正确地说你在这个程序中需要一个PIVOT和一些动态的sql。
举例来说,我提供以下内容:
CREATE PROCEDURE OrderExample
AS
CREATE TABLE #OrdersTable(
OrderNo int,
OrderDate date,
CustomerID int,
TotalItems int,
TotalAmount decimal(10,2)
)
INSERT INTO #OrdersTable VALUES(101, '2016-8-11', 354, 3, 30)
INSERT INTO #OrdersTable VALUES(102, '2016-8-12', 221, 2, 20)
INSERT INTO #OrdersTable VALUES(103, '2016-8-13', 67, 1, 20)
INSERT INTO #OrdersTable VALUES(104, '2016-8-14', 8965, 3, 40)
CREATE table #OrderedItems (
OrderNo int,
OrderItem varchar(10),
OrderQty int
)
INSERT INTO #OrderedItems VALUES(101, 'T-Shirt', 2)
INSERT INTO #OrderedItems VALUES(101, 'Bedsheet', 1)
INSERT INTO #OrderedItems VALUES(102, 'Pants', 2)
INSERT INTO #OrderedItems VALUES(103, 'Quilt', 1)
INSERT INTO #OrderedItems VALUES(104, 'T-Shirt', 2)
INSERT INTO #OrderedItems VALUES(104, 'Pants', 1)
DECLARE @itemNames varchar(max) =
(SELECT STUFF(( SELECT DISTINCT ',' + QUOTENAME(OrderItem)
FROM #OrderedItems FOR XML PATH('')), 1, 1, '') AS ColList)
DECLARE @sql varchar(max) = 'SELECT OrderNo, OrderDate, CustomerID,
TotalItems, TotalAmount,' + @itemNames + ' FROM
(SELECT o.OrderNo, o.OrderDate, o.CustomerID, o.TotalItems, o.TotalAmount,
i.OrderItem, i.OrderQty
FROM #OrdersTable o
INNER JOIN #OrderedItems i ON i.OrderNo = o.OrderNo) SubQ
PIVOT(SUM(OrderQty) FOR OrderItem IN (' + @itemNames + ')) as pvt'
exec (@sql)
DROP TABLE #OrdersTable
DROP TABLE #OrderedItems
要运行此功能,只需输入:exec OrderExample
即可结果将是
OrderNo OrderDate CustomerID TotalItems TotalAmount Bedsheet Pants Quilt T-Shirt
101 2016-08-11 354 3 30.00 1 NULL NULL 2
102 2016-08-12 221 2 20.00 NULL 2 NULL NULL
103 2016-08-13 67 1 20.00 NULL NULL 1 NULL
104 2016-08-14 8965 3 40.00 NULL 1 NULL 2
请注意,在完成的版本中,您不需要创建临时表的行,插入数据,然后最终再次删除它们。相反,您必须将#OrdersTable和#OrderedItems替换为正确表的名称(当然还有正确的字段名称)。我只包含它们,因此该示例以独立方式运行。