我正在编写存储的proc,以将不同表中的数据返回到具有特定顺序的单行中,这些顺序是主键的属性。
我有一张下表,如下所示。我认为应该使用PIVOT
函数查询下表。
*Category Table*
-----------------------
| OrderNo | Category | /********************************/
----------------------- Available Categories
| A0001 | T-Shirt | T-Shirts
| A0001 | Shorts | Shorts
| A0001 | HeadCap | HeadCap
| A0002 | Pants | Pants
| A0002 | Jackets | Jackets
| A0002 | TankTops | TankTops
| A0002 | Shorts | Bags
| A0003 | Pants |
| A0003 | Jackets |
| A0003 | Bags |
-----------------------
另一个表包含顺序属性,即OrderNo,ApprovedDate,TotalValue,Currency
*Ord_Property Table*
------------------------------------------------------
| OrderNo | ApprovedDate | TotalValue | ShipmentType |
------------------------------------------------------
| A0001 | 11/19/2019 | 68.50 | Ground |
| A0002 | 11/07/2019 | 240.00 | 2-Day |
| A0003 | 10/31/2019 | 180.00 | Ground |
------------------------------------------------------
Output-当我运行特定于订单号的查询时,我试图按照表1中所有可用类别的列以及从第二个表中选择的列,按以下方式查找任何输出。
------------------------------------------------------------------------------------------------------------------------
| OrderNo | ApprovedDate | TotalValue | ShipmentType | T-Shirt | Shorts | HeadCap | Pants | Jackets | TankTops | Bags |
------------------------------------------------------------------------------------------------------------------------
| A0001 | 11/19/2019 | 68.50 | Ground | Y | Y | Y | N | N | N | N |
| A0002 | 11/07/2019 | 240.00 | 2-Day | N | Y | N | Y | Y | Y | N |
| A0003 | 10/31/2019 | 180.00 | Ground | N | N | N | Y | Y | N | Y |
我尝试过select * from the second table and inner joined the first table on the OrderNo column
。与Select列表中的case语句一起使用,但输出与预期不同,并且输出不是单行,而是多列。
任何建议将不胜感激。
SELECT OrderNo, ApprovedDate, TotalValue ,Currency
, CASE WHEN Category = 'T-Shirt' THEN 'T-Shirt' END AS 'Requires_T-Shirt'
, CASE WHEN Category = 'Shorts' THEN 'Shorts' END AS 'Requires_Shorts'
, CASE WHEN Category = 'HeadCap' THEN 'HeadCap' END AS 'Requires_HeadCap'
, CASE WHEN Category = 'Pants' THEN 'Pants' END AS 'Requires_Pants'
, CASE WHEN Category = 'Jackets' THEN 'Jackets' END AS 'Requires_Jackets'
, CASE WHEN Category = 'TankTops' THEN 'TankTops' END AS 'Requires_TankTops'
, CASE WHEN Category = 'Bags' THEN 'Bags' END AS 'Requires_Bags'
FROM Ord_Property OP
INNER JOIN Category C ON C.OrderNo = OP.OrderNo
WHERE OP.ORDERNO = @OrderNo
尝试一下:
SELECT OrderNo, ApprovedDate, TotalValue ,Currency
, MAX(CASE WHEN Category = 'T-Shirt' THEN 'T-Shirt' END) AS 'Requires_T-Shirt'
, MAX(CASE WHEN Category = 'Shorts' THEN 'Shorts' END) AS 'Requires_Shorts'
, MAX(CASE WHEN Category = 'HeadCap' THEN 'HeadCap' END) AS 'Requires_HeadCap'
, MAX(CASE WHEN Category = 'Pants' THEN 'Pants' END) AS 'Requires_Pants'
, MAX(CASE WHEN Category = 'Jackets' THEN 'Jackets' END) AS 'Requires_Jackets'
, MAX(CASE WHEN Category = 'TankTops' THEN 'TankTops' END) AS 'Requires_TankTops'
, MAX(CASE WHEN Category = 'Bags' THEN 'Bags' END) AS 'Requires_Bags'
FROM Ord_Property OP
INNER JOIN Category C
ON C.OrderNo = OP.OrderNo
WHERE OP.ORDERNO = @OrderNo
GROUP BY OrderNo, ApprovedDate, TotalValue ,Currency
尝试一下
这里不需要PIVOT
。简单的Aggregate(MAX)将给出结果。
SELECT C.OrderNo, ApprovedDate, TotalValue ,Currency
, MAX(CASE WHEN Category = 'T-Shirt' THEN 'Y' ELSE 'N' END) AS 'T-Shirt'
, MAX(CASE WHEN Category = 'Shorts' THEN 'Y' ELSE 'N' END) AS 'Shorts'
, MAX(CASE WHEN Category = 'HeadCap' THEN 'Y' ELSE 'N' END) AS 'HeadCap'
, MAX(CASE WHEN Category = 'Pants' THEN 'Y' ELSE 'N' END) AS 'Pants'
, MAX(CASE WHEN Category = 'Jackets' THEN 'Y' ELSE 'N' END) AS 'Jackets'
, MAX(CASE WHEN Category = 'TankTops' THEN 'Y' ELSE 'N' END) AS 'TankTops'
, MAX(CASE WHEN Category = 'Bags' THEN 'Y' ELSE 'N' END) AS 'Bags'
FROM Ord_Property OP
INNER JOIN Category C
ON C.OrderNo = OP.OrderNo
WHERE OP.ORDERNO = @OrderNo
GROUP BY C.OrderNo, ApprovedDate, TotalValue ,Currency
SELECT OrderNo, ApprovedDate, TotalValue ,Currency
, MAX(CASE WHEN Category = 'T-Shirt' THEN 'Y' ELSE 'N' END) AS 'T-Shirt'
, MAX(CASE WHEN Category = 'Shorts' THEN 'Y'ELSE 'N' END) AS 'Shorts'
, MAX(CASE WHEN Category = 'HeadCap' THEN 'Y' ELSE 'N' END) AS 'HeadCap'
, MAX(CASE WHEN Category = 'Pants' THEN 'Y' ELSE 'N' END) AS 'Pants'
, MAX(CASE WHEN Category = 'Jackets' THEN 'Y' ELSE 'N' END) AS 'Jackets'
, MAX(CASE WHEN Category = 'TankTops' THEN 'Y' ELSE 'N' END) AS 'TankTops'
, MAX(CASE WHEN Category = 'Bags' THEN 'Y' ELSE 'N'END) AS 'Bags'
FROM Ord_Property OP
INNER JOIN Category C
ON C.OrderNo = OP.OrderNo
WHERE OP.ORDERNO = @OrderNo
GROUP BY OrderNo, ApprovedDate, TotalValue ,Currency
尝试此查询...
这里我正在使用案例,然后查询 ...如果记录匹配,则'Y'否则'N'
它返回了multiple rows
,因为您加入了多个categories
SELECT OrderNo, ApprovedDate, TotalValue ,Currency
, case when
(select 1 from Category t1
where t1.Category = 'T-Shirt' and t1.orderNo = OP.OrderNo) = 1
then 'Y' else 'N' end AS 'Requires_T-Shirt'
, case when
(select 1 from Category t1
where t1.Category = 'Shorts' and t1.orderNo = OP.OrderNo) = 1
then 'Y' else 'N' end AS 'Requires_Shorts'
, case when
(select 1 from Category t1
where t1.Category = 'HeadCap' and t1.orderNo = OP.OrderNo) = 1
then 'Y' else 'N' end AS 'Requires_HeadCap'
, case when
(select 1 from Category t1
where t1.Category = 'Pants' and t1.orderNo = OP.OrderNo) = 1
then 'Y' else 'N' end AS 'Requires_Pants'
, case when
(select 1 from Category t1
where t1.Category = 'Jackets' and t1.orderNo = OP.OrderNo) = 1
then 'Y' else 'N' end AS 'Requires_Jackets'
, case when
(select 1 from Category t1
where t1.Category = 'TankTops' and t1.orderNo = OP.OrderNo) = 1
then 'Y' else 'N' end AS 'Requires_TankTops'
, case when
(select 1 from Category t1
where t1.Category = 'Bags' and t1.orderNo = OP.OrderNo) = 1
then 'Y' else 'N' end AS 'Requires_Bags'
FROM Ord_Property OP
WHERE OP.ORDERNO = @OrderNo
您也可以使用sqlserver iif
函数
, iif(max(iif(C.Category = 'T-Shirt' and C.orderNo = OP.OrderNo, 1, 0)) = 1, 'Y', 'N') as 'Requires_T-Shirt'
, iif(max(iif(C.Category = 'Shorts' and C.orderNo = OP.OrderNo, 1, 0)) = 1, 'Y', 'N') as 'Requires_Shorts'
, iif(max(iif(C.Category = 'HeadCap' and C.orderNo = OP.OrderNo, 1, 0)) = 1, 'Y', 'N') as 'Requires_HeadCap'
, iif(max(iif(C.Category = 'Pants' and C.orderNo = OP.OrderNo, 1, 0)) = 1, 'Y', 'N') as 'Requires_Pants'
, iif(max(iif(C.Category = 'Jackets' and C.orderNo = OP.OrderNo, 1, 0)) = 1, 'Y', 'N') as 'Requires_Jackets'
, iif(max(iif(C.Category = 'TankTops' and C.orderNo = OP.OrderNo, 1, 0)) = 1, 'Y', 'N') as 'Requires_TankTops'
, iif(max(iif(C.Category = 'Bags' and C.orderNo = OP.OrderNo, 1, 0)) = 1, 'Y', 'N') as 'Requires_Bags'