如何在SQL中将多个值分组到单个列中
给定以下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
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