Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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_Oracle - Fatal编程技术网

如何在SQL中将多个值分组到单个列中

如何在SQL中将多个值分组到单个列中,sql,sql-server,oracle,Sql,Sql Server,Oracle,给定以下SQL SELECT T1."PN" as "Part Number", T2."QTY" as "Quantity", T2."BRANCH" AS "Location", T3."STOCK" as "Bin" FROM "XYZ"."PARTS" T1, "XYZ"."BALANCES" T2, "XYZ"."DETAILS" T3 WHERE (T2."PART_ID" = T1."PART_ID") AND (T3."PART

给定以下SQL

SELECT 
    T1."PN" as "Part Number",
    T2."QTY" as "Quantity",
    T2."BRANCH" AS "Location", T3."STOCK" as "Bin"
FROM 
    "XYZ"."PARTS" T1,
    "XYZ"."BALANCES" T2,
    "XYZ"."DETAILS" T3
WHERE (T2."PART_ID" = T1."PART_ID") AND (T3."PART_ID" = T1."PART_ID")
ORDER BY "Part Number" ASC, "Location" ASC
我们得到的结果如下

YZ-7-CA-080                 88  01  STOCK7
YZ-7-CA-080                 88  01  03482 
YZ-7-CA-080                 88  01  A8K2D
对于位置01,零件号为YZ-7-CA-080的零件有88件,可在3个料仓7、03482或A8K2D中的任何一个中找到。 位置值是指一个普通的分支,如仓库,数量是针对整个仓库,而不是仓位

我需要更改输出,这样我们就可以写出一个条目,而不是一个列表

YZ-7-CA-080                 88  01  STOCK7,03482,A8K2D
所以我正在寻找一种在SQL中重构结果的好方法。我觉得应该有一种方法来使用函数或子查询或类似的东西,希望有一个单一的多数据库解决方案,但假设在不同的数据库上可能需要不同的解决方案。(Oracle是我们试图解决的主要解决方案,但我们需要的次要优先级数据库是SQL Server)

注意:每个零件号有多个位置,因此仅在第一列上设置distinct以减少多个零件号条目是不够的。位置02处也会有多个相同的零件号,且具有相同的问题


想法?

您可以使用子字符串和子查询,在第一列中应用distinct


此问题中描述了类似的技术:

您可以在Oracle中使用
listag()
执行此操作:


我还修复了查询以使用正确的显式连接语法。

对于较旧的版本,我想WM_CONCAT会起作用。修改Gordon Linoff的查询:

SELECT T1."PN" as "Part Number", max(T2."QTY") as "Quantity", T2."BRANCH" AS "Location",
       WM_CONCAT(T3."STOCK") as Bins
FROM "XYZ"."PARTS" T1 JOIN
     "XYZ"."BALANCES" T2
     ON T2."PART_ID" = T1."PART_ID" JOIN
     "XYZ"."DETAILS" T3
     ON T3."PART_ID" = T1."PART_ID"
GROUP BY t1.PN, t2.Branch
ORDER BY "Part Number", "Location";
另请参考链接以获取替代方法:在链接中包含答案以供参考:

create table countries ( country_name varchar2 (100));
insert into countries values ('Albania');
insert into countries values ('Andorra');
insert into countries values ('Antigua');


SELECT SUBSTR (SYS_CONNECT_BY_PATH (country_name , ','), 2) csv
      FROM (SELECT country_name , ROW_NUMBER () OVER (ORDER BY country_name ) rn,
                   COUNT (*) OVER () cnt
              FROM countries)
     WHERE rn = cnt
START WITH rn = 1
CONNECT BY rn = PRIOR rn + 1;

CSV                                                                             
--------------------------
Albania,Andorra,Antigua    

您实际使用的是哪个
RDBMS
?听起来像Oracle,如果是这样,请使用
listag
…Oracle first和primary yes,但我们也正在为SQL Server构建一个连接器,以便以后执行类似操作。看起来很有希望。。。感谢您的更正和加入。我尝试设置它,但由于某种原因,我收到了“错误消息:ORA-00923:FROM关键字未在预期位置找到”。我不清楚为什么会发生此错误。好的,我将尝试解决它。我猜组中的BY是错别字?@Streamline。是的,是的。经过一些研究,我认为显示错误的原因是,Listag在11gR2之前不可用,我确认我们客户的数据库是10g。我读到WM_CONCAT不受支持且没有文档记录,以及其他人们建议不要使用它的帖子。如果在测试时命令似乎没有任何问题,那么使用该命令的风险是什么?这会不会给数据库带来任何风险?我用WM_CONCAT尝试了你的答案,它确实有效,谢谢!同样,我想知道使用不受支持的命令会有什么潜在后果。您回答中使用substr的第二部分没有明确告诉我如何为当前sql组合更复杂的表联接和选择。这应该是我的sql的子查询吗?
create table countries ( country_name varchar2 (100));
insert into countries values ('Albania');
insert into countries values ('Andorra');
insert into countries values ('Antigua');


SELECT SUBSTR (SYS_CONNECT_BY_PATH (country_name , ','), 2) csv
      FROM (SELECT country_name , ROW_NUMBER () OVER (ORDER BY country_name ) rn,
                   COUNT (*) OVER () cnt
              FROM countries)
     WHERE rn = cnt
START WITH rn = 1
CONNECT BY rn = PRIOR rn + 1;

CSV                                                                             
--------------------------
Albania,Andorra,Antigua