Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以在一个更大的SQL查询中只包含一列,或者将多行转换为额外的列吗?_Sql_Sql Server_Sql Server 2012 - Fatal编程技术网

我可以在一个更大的SQL查询中只包含一列,或者将多行转换为额外的列吗?

我可以在一个更大的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只是序

这适用于试图生成信息以放入电子邮件并发送的供应商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];