我可以在一个更大的SQL查询中只包含一列,或者将多行转换为额外的列吗?
这适用于试图生成信息以放入电子邮件并发送的供应商web应用程序 我见过类似的答案,用于XML路径,但它将整个返回集中到一行中,每个项目需要一行。我也看到过使用子查询的答案,但在本例中似乎不起作用 我有两张桌子;OrderItem OI列出所有订购过的项目,OrderItemProperties OIP列出任何客户为所有项目所做的所有选项,每个项目大约5到6个选项。没有任何属性是通过属性类型以任何方式标识的,该表只列出了[ItemID,PropUID,PropValue],其中PropUID只是序列号 到目前为止,我得到的是:我可以在一个更大的SQL查询中只包含一列,或者将多行转换为额外的列吗?,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,这适用于试图生成信息以放入电子邮件并发送的供应商web应用程序 我见过类似的答案,用于XML路径,但它将整个返回集中到一行中,每个项目需要一行。我也看到过使用子查询的答案,但在本例中似乎不起作用 我有两张桌子;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。这应该为客户订单中的每一项生成一行,然后使用什么传递到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...
我正在使用的应用程序传递给查询的参数数量有限,但它确实允许我在查询中创建和声明变量
任何帮助都是感激的,因为我现在只是把东西拼凑在一起 我想这会管用的,但很难看。理想情况下,您将拥有某种属性键,用于描述MSNISA vs的值。如果您可以发布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
我认为聚合可以满足您的要求:
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命令。我没有样本数据来测试这一点,可能是轻微的语法问题
只是澄清一下,如果将“for xml path”部分与group by语句结合使用,“for xml path”部分仍然可以实现所需的结果。此外,您是否考虑过使用枢轴?谢谢Sean。我正在研究使用带有xml路径的组,但目前它会抛出错误,所以我想我没有正确地组合它们,我将对此进行研究。此外,我从未负责过与sql相关的pivot,只有excel在本例中不可用。sql还具有可利用的pivot函数,非常类似于电子表格!我还用小提琴更新了我的答案,这样你们就可以明白我的意思了。你们是对的,若OIP表中有一个属性键,表示每个值用于哪个属性,那个么这是一个很小的问题。不幸的是,事实并非如此。它只是按顺序列出一个项目的所有值,除了根据值是什么进行推断之外,无法知道它们是用于什么属性的。我相信这可能是软件创作者的疏忽。这确实在一行中返回了所有内容。我不知道它是如何工作的,或者它知道在一列中对时间值进行分组,在另一列中对位置值进行分组,但是它是工作的。嗨,PZ01,这段代码假设在按itemID和TotalPrice进行分组时,itemID有两个PropValue条目。结果是只要条件不变,这段代码就可以工作——这就是为什么Gordon只允许您在示例中提供的值来进行控制。如果有第三行,比如“ZZZZ_垃圾”,我们无法轻易过滤掉,它可能会导致问题。
-- 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];