我有值的表
X Y Z
- --- -
1 abc P
1 def Q
Run Code Online (Sandbox Code Playgroud)
我需要一个普通的查询(不是pl/sql),它可以给出结果
X Y Z
- ------- ---
1 abc,def P,Q
Run Code Online (Sandbox Code Playgroud)
即,基于列X,值被转换为csv格式
可以有三列以上.
实现这一目标的最佳方法是什么?编辑:在MSSQL 2005中
表
a | b
------------
x | 1
x | 4
y | 6
y | 1
Run Code Online (Sandbox Code Playgroud)
查询:
SELECT ? FROM Table
Run Code Online (Sandbox Code Playgroud)
所以输出是:
a | ListOfB
------------
x | 1, 4
y | 6, 1
Run Code Online (Sandbox Code Playgroud) 我的表结构看起来像这样,我是这个领域的新手.我知道基本的问题.但这对我来说很复杂.请帮我这样做.
表结构
Customer Product piriority
10001 Main_product 1
10001 Sub_product1 2
10001 Sub_product2 2
10001 Sub_product3 2
10001 Sub_product4 2
10002 Main_product 1
10002 Sub_product1 2
10002 Sub_product2 2
Run Code Online (Sandbox Code Playgroud)
预期产出:
Customer Main_Product Sub_product
10001 Main_product Sub_product1,Sub_product2,Sub_product3,Sub_product4
10002 Main_product Sub_product1,Sub_product2
Run Code Online (Sandbox Code Playgroud) 我正在使用postgresql 9.0
我想知道是否可以将三个属性连接在一起。
这就是我连接两个属性(书本和逗号)的方式:
SELECT string_agg(book, ',') FROM authors where id = 1;
| book1,book2,book3|
--------------------
Run Code Online (Sandbox Code Playgroud)
我怎样才能做如下的事情:
SELECT string_agg(name, ':', book, ',') FROM authors where id = 1;
| Ahmad: book1,book2,book3|
----------------
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗?谢谢。
我在Oracle中有一个表,其中有两列。在第一列中,有时会有重复的值对应于第二列中的其他值。如何编写仅显示第一列的唯一值和第二列的所有可能值的查询?
该表如下所示
COLUMN_1 | COLUMN_2
NUMBER_1 | 4
NUMBER_2 | 4
NUMBER_3 | 1
NUMBER_3 | 6
NUMBER_4 | 3
NUMBER_4 | 4
NUMBER_4 | 5
NUMBER_4 | 6
Run Code Online (Sandbox Code Playgroud) 我有一个包含三列的服务表。
服务
sr_id lang alias
1 EN A
1 PA B
1 HI C
2 EN D
2 HI E
Run Code Online (Sandbox Code Playgroud)
现在,我想输出每个服务 id、lang 和别名列,这些列将是服务别名的串联。
示例输出 -
SR_ID lang alias
1 EN A,B,C
1 PA A,B,C
1 HI A,B,C
2 EN D,E
2 HI D,E
Run Code Online (Sandbox Code Playgroud)
我如何使用 PostgreSQL 9.4 做到这一点?
正如标题所说,我需要使用此查询(无字符串 Agg)将结果查询与字符串 agg 连接起来
select pdet.dept_id, pdet.grade_id
from psa_aso_target ptar
inner join psa_aso_targetdetails pdet on pdet.target_id=ptar.target_id and ptar.branch_id='18'
Run Code Online (Sandbox Code Playgroud)
结果是这样的
然后我添加字符串 agg
select pdet.dept_id, string_agg(distinct pdet.grade_id::char,'|') as grade
from psa_aso_target ptar
inner join psa_aso_targetdetails pdet on pdet.target_id=ptar.target_id and ptar.branch_id='18'
group by pdet.dept_id
Run Code Online (Sandbox Code Playgroud)
我希望结果结果是
dept_id | grade_id
2 | 1|2|3
3 | 4|13|14|15|18
5 | 6|10|17
63 | 2|4|7
Run Code Online (Sandbox Code Playgroud)
但我得到的结果是
dept_id | grade_id
2 | 1|2|3
3 | 1|4
5 | 1|6
63 | 2|4|7
Run Code Online (Sandbox Code Playgroud)
任何的想法?
我的桌子看起来像这样
Color Order
------------
Red 49
Blue 32
Green 80
Green 30
Blue 93
Blue 77
Red 20
Green 54
Red 59
Red 42
Red 81
Green 35
Blue 91
Run Code Online (Sandbox Code Playgroud)
我的查询是
SELECT Color, Count(*) AS Count, STRING_AGG(Order,',') AS AggOrder
FROM MyTable
GROUP BY Color
Run Code Online (Sandbox Code Playgroud)
当我按颜色分组并聚合时,我得到未排序的订单
像这样的东西
Color Count AggOrder
------------------------------
Red 5 49,20,59,42,81
Blue 4 32,93,77,91
Green 4 80,30,54,35
Run Code Online (Sandbox Code Playgroud)
问题:AggOrder 无序 49,20,59,42,81
我想订购
所以最终结果是
Color Count AggOrder
------------------------------
Red 5 20,42,49,59,81
Blue 4 32,77,91,93
Green 4 30,35,54,80
Run Code Online (Sandbox Code Playgroud)
我尝试了这个查询
SELECT Color, …Run Code Online (Sandbox Code Playgroud) 有没有其他方法可以连接 SQL 列并用逗号分隔。我使用以下逻辑进行串联。列 (col1,col2,col3) 可以具有空值。
select
stuff(
left(concat(col1,',',col2,',',col3),
len(concat(col1,',',col2,',',col3)) -
patindex('%[^,]%',reverse(concat(col1,',',col2,',',col3)))+1
)
,1,
patindex('%[^,]%',concat(col1,',',col2,',',col3))-1,''
)
from mytable
Run Code Online (Sandbox Code Playgroud)
我有以下形状的数据:
BOM -- 500 rows, 4 cols
PartProject -- 2.6mm rows, 4 cols
Project -- 1000 rows, 5 cols
Part -- 200k rows, 18 cols
Run Code Online (Sandbox Code Playgroud)
然而,当我尝试这样做时string_agg,我的代码将花费 10 多分钟才能在 500 行上执行。我该如何改进这个查询(数据不可用)。
select
BOM.*,
childParentPartProjectName
into #tt2 -- tt for some testing
from #tt1 AS BOM -- tt for some testing
-- cross applys for string agg many to one
CROSS APPLY (
SELECT childParentPartProjectName = STRING_AGG(PROJECT_childParentPart.NAME, ', ') WITHIN GROUP (ORDER BY PROJECT_childParentPart.NAME)
FROM (
SELECT DISTINCT PROJECT3.NAME
FROM …Run Code Online (Sandbox Code Playgroud) sql ×7
sql-server ×4
oracle ×3
postgresql ×3
t-sql ×2
csv ×1
oracle11g ×1
string-agg ×1
stuff ×1