我可以根据另一个表中的值创建带有标题名称的列吗?

时间:2016-08-23 20:20:56

标签: sql-server

这是我的第一个问题,如果我的问题看起来有问题,请原谅。虽然我对ms access数据库有一些了解,但我对编程和SQL都是全新的。

我创建了两个表OrdersTabelOrderedItems。然后我想创建另一个表OrderFullDetails,如下面的屏幕截图所示:

table Picture

我想创建OrderFullDetails表,如下所示。

  1. Item表中的OrderedItem列中的包含应在OrderFullDetails表中按名称创建单独的列。

  2. 如果OrderFullDetails表中已存在的列等于OrderedItem表中的项目名称,则只应根据OrderNo将Qty值输入到匹配列。如果没有列匹配,则应创建一个新列。

  3. 你的帮助对我来说将是万元。

    由于

1 个答案:

答案 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替换为正确表的名称(当然还有正确的字段名称)。我只包含它们,因此该示例以独立方式运行。