[英]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.