首页 > 解决方案 > 如何使用其他表中的列名和值创建表

问题描述

我有一个鞋业公司的项目,需要加入 3 张桌子。我可以用 C# winform 中的 DataTable 来做,但我想知道我是否可以直接在 SQL 中组合。

表 1 命名 MoldQty,我将使用 3 列

Model | Size |MoldQuantity
--------------------------
AAA   |6.5   | 1    
AAA   |7     | 2    
AAA   |7.5   | 1    
AAA   |8     | 2    
AAA   |8.5   | 1    
AAA   |9     | 2    
AAA   |9.5   | 1

表 2 名称 具有许多其他列的订单

Order Num   | Model | 
---------------------
20200101xx  | AAA   |    
20200101xy  | AAA   |    
20200101yy  | BBB   |

表 3 名称 OrderDetail

Order Num   | Size |Quantity
----------------------------
20200101xx  | 6.5  |100    
20200101xx  | 7.5  |100    
20200101xx  | 8.5  |200    
20200101xy  | 7    |100    
20200101xy  | 8    |100    
20200101xy  | 9    |200

现在我想为模型 AAA 制作一个表,其中包含一些列的名称来自 MoldQty.Size 和值来自 OrderDetail.Quantity

Order Num   | 6.5  | 7    | 7.5  | 8    | 8.5  | 9    | 9.5  |
--------------------------------------------------------------
20200101xx  | 100  | Null | 100  | Null | 200  | Null | Null |    
20200101xy  | Null | 100  | Null | 100  | Null | 100  | Null |

有人知道吗?太感谢了。

标签: sql-serverjoinselect

解决方案


仅当查询是动态的时,才需要对 MoldQty 表的引用。以下是示例表、数据和查询。

DROP TABLE IF EXISTS #Order;
GO
CREATE TABLE #Order
(OrderNum CHAR(10) NOT NULL, 
 Model    CHAR(3) NOT NULL
);
GO

INSERT INTO #Order
(OrderNum, 
 Model
)
VALUES
('20200101xx', 
 'AAA'
),
('20200101xy', 
 'AAA'
),
('20200101yy', 
 'BBB'
);

DROP TABLE IF EXISTS #OrderDetail;
GO
CREATE TABLE #OrderDetail
(OrderNum CHAR(10) NOT NULL, 
 Size     VARCHAR(5) NOT NULL, 
 Quantity INT NOT NULL
);
GO

INSERT INTO #OrderDetail
(OrderNum, 
 Size, 
 Quantity
)
VALUES
('20200101xx', 
 '6.5', 
 100
),
('20200101xy', 
 '7', 
 100
),
('20200101xx', 
 '7.5', 
 200
),
('20200101xy', 
 '8', 
 100
),
('20200101xx', 
 '8.5', 
 100
),
('20200101xy', 
 '9', 
 200
);

SELECT o.OrderNum, 
       SUM(IIF(od.Size = '6.5', od.Quantity, NULL)) '6.5', 
       SUM(IIF(od.Size = '7', od.Quantity, NULL)) '7', 
       SUM(IIF(od.Size = '7.5', od.Quantity, NULL)) '7.5', 
       SUM(IIF(od.Size = '8', od.Quantity, NULL)) '8', 
       SUM(IIF(od.Size = '8.5', od.Quantity, NULL)) '8.5', 
       SUM(IIF(od.Size = '9', od.Quantity, NULL)) '9', 
       SUM(IIF(od.Size = '9.5', od.Quantity, NULL)) '9.5'
FROM #Order o
     JOIN #OrderDetail od ON o.OrderNum = od.OrderNum
WHERE o.Model = 'AAA'
GROUP BY o.OrderNum;

推荐阅读