使用数据透视功能订购数据并选择辅助表上的特定列

问题描述 投票:0回答:4

我正在编写存储的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
sql-server pivot
4个回答
0
投票

尝试一下:

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

0
投票

尝试一下

这里不需要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

0
投票
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'


0
投票

它返回了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'
© www.soinside.com 2019 - 2024. All rights reserved.