繁体   English   中英

我可以在更大的 SQL 查询中只连接一列或将多行转换为额外的列吗?

[英]Can I concat ONLY one column within a larger SQL query OR transpose multiple rows into extra columns?

这适用于试图生成信息以放入电子邮件并发送的供应商 Web 应用程序。

我见过使用 FOR XML PATH 的类似答案,但将整个返回合并为一行,其中每个项目需要一行。 我还看到了使用子查询的答案,但在这种情况下似乎不起作用。

我有 2 张桌子; OrderItem OI 列出所有订购过的商品,OrderItemProperties OIP 列出任何客户为所有商品所做的所有选项(每个商品大约 5 到 6 个)。 没有任何属性以任何方式通过属性类型标识,该表仅列出了 [ItemID, PropUID, PropValue],其中 PropUID 只是序列号。

到目前为止,我所拥有的是:

SELECT OI.ItemID, OI.TotalPrice, OIP.PropValue
FROM OrderItemProperties OIP
JOIN OrderItem OI ON OI.ItemID = OIP.ItemID
WHERE OI.OrderID = 12345
AND (OIP.PropValue IN ('MSNISA', 'KHNISA') OR OIP.PropValue LIKE '<DateTime>%')

不幸的是,软件传递给查询的唯一参数是 OI.OrderID。 这应该为客户订单中的每个项目生成一行,然后使用<xsl:for-each select..>传递给 xlst 文档,但是我得到的是(显然!)

ItemID | TotalPrice | PropValue
555    | 9.99       | MSNISA
555    | 9.99       | <DateTime><Server>17/01/2020...
556    | 19.50      | KHNISA
556    | 19.50      | <DateTime><Server>18/01/2020...

我想要的是:

ItemID | TotalPrice | PropValue
555    | 9.99       | MSNISA, <DateTime><Server>17/01/2020...
556    | 19.50      | KHNISA, <DateTime><Server>18/01/2020...

或者什么会更好:

ItemID | TotalPrice | PropValue[1] | PropValue[2]
555    | 9.99       | MSNISA       | <DateTime><Server>17/01/2020...
556    | 19.50      | KHNISA       | <DateTime><Server>18/01/2020...

我使用的应用程序只有有限数量的参数传递给查询,但它允许我在查询中创建和声明变量。

感谢任何帮助,因为我现在只是在拼凑东西!

我认为聚合可以满足您的需求:

SELECT OI.ItemID, OI.TotalPrice,
       MIN(OIP.PropValue), MAX(OIP.PropValue)
FROM OrderItemProperties OIP JOIN
     OrderItem OI
     ON OI.ItemID = OIP.ItemID
WHERE OI.OrderID = 12345 AND
      (OIP.PropValue IN ('MSNISA', 'KHNISA') OR OIP.PropValue LIKE '<DateTime>%')
GROUP BY OI.ItemID, OI.TotalPrice;

我相信您可以按照最初的理论使用 STUFF() 命令。 我没有样本数据来测试这个,可能是轻微的语法问题。 SQLFiddle

-- Casts XML back to varchar
SELECT    [oi].[itemid]
        , MAX([oi].[totalprice]) AS          "totalprice"
        , STUFF(
(
    SELECT ',' + [oip].[propvalue]
    FROM    [orderitemproperties] AS [oip]
    WHERE  [oip].[itemid] = [oi].[itemid] FOR XML PATH(''), TYPE
).value
       ( '.', 'varchar(max)' ), 1, 1, '') AS "propvalue"
FROM orderitem AS oi
GROUP BY [oi].[itemid];
-- ORIGINAL QUERY - experiences issues with xml to varchar formatting
SELECT    [oi].[itemid]
        , MAX([oi].[totalprice]) as "TotalPrice"
        , STUFF(
(
    SELECT ',' + [oip].[propvalue]
    FROM    [orderitemproperties] AS [oip]
    WHERE  [oip].[itemid] = [oi].[itemid] FOR XML PATH('')
), 1, 1, '') as "PropValue"
FROM orderitem AS oi
GROUP BY [oi].[itemid];

我认为这会起作用,但它很丑陋。 理想情况下,您将拥有某种属性键来描述“MSNISA”与“”的值。 如果您可以发布 OIP 表的架构,我可以提供更好的答案。

SELECT [ItemID] = OI.ItemID, [TotalPrice] = OI.TotalPrice, [PropValue1] = OIP1.PropValue, [PropValue2] = OIP2.PropValue
FROM OrderItem OI
JOIN OrderItemProperties OIP1 on OIP1.ItemID = OI.ItemID AND OIP1.PropValue = 'MSNISA'
JOIN OrderItemProperties OIP2 on OIP2.ItemID = OI.ItemID AND OIP2.Propvalue like '<DateTime>%'
WHERE OI.OrderID = 12345
UNION
    SELECT [ItemID] = OI.ItemID, [TotalPrice] = OI.TotalPrice, [PropValue1] = OIP1.PropValue, [PropValue2] = OIP2.PropValue
FROM OrderItem OI
JOIN OrderItemProperties OIP1 on OIP1.ItemID = OI.ItemID AND OIP1.PropValue = 'KHNISA'
JOIN OrderItemProperties OIP2 on OIP2.ItemID = OI.ItemID AND OIP2.Propvalue like '<DateTime>%'
WHERE OI.OrderID = 12345

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM