考虑一个包含三个行的名称的数据库表:
Peter
Paul
Mary
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的方法可以将其转换为单个字符串Peter, Paul, Mary
?
我正在尝试将基于MySQL的应用程序迁移到Microsoft SQL Server 2005(不是选择,而是生活).
在原始应用程序中,我们几乎完全使用符合ANSI-SQL的语句,但有一个重要的例外 - 我们group_concat
经常使用MySQL的函数.
group_concat
顺便说一下,这样做:给出一张表,比如说,员工姓名和项目......
SELECT empName, projID FROM project_members;
Run Code Online (Sandbox Code Playgroud)
收益:
ANDY | A100
ANDY | B391
ANDY | X010
TOM | A100
TOM | A510
Run Code Online (Sandbox Code Playgroud)
...这是你用group_concat得到的:
SELECT
empName, group_concat(projID SEPARATOR ' / ')
FROM
project_members
GROUP BY
empName;
Run Code Online (Sandbox Code Playgroud)
收益:
ANDY | A100 / B391 / X010
TOM | A100 / A510
Run Code Online (Sandbox Code Playgroud)
所以我想知道的是:是否有可能在SQL Server中编写用户定义的函数来模拟其功能group_concat
?
我几乎没有使用UDF,存储过程或类似的东西的经验,只是直接的SQL,所以请错误地说太多的解释:)
我有一个包含以下代码的sql函数:
DECLARE @CodeNameString varchar(100)
SELECT CodeName FROM AccountCodes ORDER BY Sort
Run Code Online (Sandbox Code Playgroud)
我需要将select查询中的所有结果连接到CodeNameString中.
显然,C#代码中的FOREACH循环会这样做,但我如何在SQL中执行此操作?
对不起,如果这是愚蠢的,我真的是一个新手试图指出这一点.
Table A:
ID Rank Name
1 100 Name1
1 45 Name2
2 60 Name3
2 42 Name4
2 88 Name5
Table B:
ID FileName
1 fn1
2 fn2
Run Code Online (Sandbox Code Playgroud)
我想要的是
1 fn1 name1
2 fn2 name5
Run Code Online (Sandbox Code Playgroud)
这是我的查询的样子,但是当我进行连接时,它给了我多行结果(而不是max)
select B.Id B.FileName,A.Name
FRom B
JOIN (
select A.Id, MAX(A.Rank)as ExpertRank
from A
group by A.Id
) as NewA on A.Id = B.ID
join B on A.Rank = NewA.Rank
Run Code Online (Sandbox Code Playgroud)
子查询工作正常,我得到了加入的问题.
我该如何解决?
谢谢.
我有sql server 2008 R2
最后一个是我错过的.
select B.Id B.FileName,A.Name
FRom B
JOIN …
Run Code Online (Sandbox Code Playgroud) 我有下表:tblFile
我想要的输出:
我将许多行连接成一个文本字符串; 但是,我无法正确分组.现在代码只显示FileNameString字段中的每条记录:AAA,BBB,CCC,DDD,EEE,FFF
任何有关分组的建议!
SELECT FileID, Stuff(
(SELECT N', ' + CONVERT(Varchar, FileName)
FROM tblFile FOR XML PATH(''),TYPE )
.value('text()[1]','nvarchar(max)'),1,2,N'')AS FileNameString
From tblFile
GROUP BY FileID
Run Code Online (Sandbox Code Playgroud) 我有这样的查询:
SELECT name from users
Run Code Online (Sandbox Code Playgroud)
它的结果是许多记录:
1 user1
2 user2
3 user3
Run Code Online (Sandbox Code Playgroud)
我希望将所有这些记录放在一行中用逗号分隔:
user1, user2, user3
Run Code Online (Sandbox Code Playgroud)
如果查询结果为空,则为空行.
如何使用T-SQL
?UNPIVOT
?
有没有办法在SQL Server的存储过程中通过索引访问列?
目的是计算大量列.我正在阅读关于游标的内容,但我不知道如何应用它们.
让我解释一下我的问题:
我有一排像:
field_1 field_2 field_3 field_4 ...field_d Sfield_1 Sfield_2 Sfield_3...Sfield_n
1 2 3 4 d 10 20 30 n
Run Code Online (Sandbox Code Playgroud)
我需要计算类似的东西 (field_1*field1) - (Sfield_1* Sfiled_1) / more...
因此结果存储在表列中d次.
所以结果就是一张d column * d row
桌子.
由于列数是可变的,我正在考虑制作动态SQL,在字符串中获取列的名称并拆分我需要的列,但这种方法使问题更难.我认为通过索引获取列号可以使生活更轻松.
如何在sql中用单引号和逗号连接列值?
select tpaa_id from dbo.Sheet
where tpaa_id is not null
Run Code Online (Sandbox Code Playgroud)
目前查询返回,值为..
ABC123
ABC456
Run Code Online (Sandbox Code Playgroud)
我们有大约 1000 条记录。
我希望返回
'ABC123',
'ABC456',
Run Code Online (Sandbox Code Playgroud) 说我有下表:
id|myId|Name
-------------
1 | 3 |Bob
2 | 3 |Chet
3 | 3 |Dave
4 | 4 |Jim
5 | 4 |Jose
-------------
Run Code Online (Sandbox Code Playgroud)
是否可以使用递归CTE生成以下输出:
3 | Bob, Chet, Date
4 | Jim, Jose
Run Code Online (Sandbox Code Playgroud)
我已经玩过一些但却无法让它发挥作用.我会用更好的技术做得更好吗?
如果我要查询我们的ORDERS表,我可能会输入以下内容:
SELECT * FROM ORDERS
WHERE ITEM_NAME = 'Fancy Pants'
Run Code Online (Sandbox Code Playgroud)
在此查询的结果中,我可能会得到以下内容:
----------------------------------------------------------------------
ORDER_ID WAIST First_Name Email
----------------------------------------------------------------------
001 32 Jason j-diddy[at]some-thing.com
005 28 Pip pirrip[at]british-mail.com
007 28 HAL9000 olhal[at]hot-mail.com
Run Code Online (Sandbox Code Playgroud)
现在,我也想从另一个表中提取信息:
SELECT*FROM PRODUCTS ITERE_NAME ='Fancy Pants'
------------------------------------------
PRODUCT_ID Product Prod_Desc
------------------------------------------
008 Fancy Pants Really fancy.
Run Code Online (Sandbox Code Playgroud)
但是,最后,我实际上想通过SQL查询将这些记录压缩成一行:
-----------------------------------------------------------------------------
PRODUCT ORDER_Merged First_Name_Merged Email_Merged
-----------------------------------------------------------------------------
Fancy Pants 001,005,007 Jason,Pip,Hal9000 j-di[...].com, pirrip[...].com
Run Code Online (Sandbox Code Playgroud)
无论如何,这就是它的样子.我无法弄清楚的是"合并"查询的样子.
不幸的是,我在这里的搜索引导我获得PHP的结果.我发现了几个结果:通过SQL合并到CSV行,但我认为它们在我的场景中不起作用.
任何见解都将一如既往地受到高度赞赏.
啊,事实证明STUFF
,FOR XML
功能正是我所需要的.谢谢大家!!
Select
A.name,
stuff((
select ',' + B.address
from …
Run Code Online (Sandbox Code Playgroud)