如何在T-SQL中累加值?AFAIK没有ARRAY类型。
我想在同一个查询中重用这些值,就像这个PostgreSQL示例中使用array_agg()所演示的那样。
SELECT a[1] || a[i] AS foo
, a[2] || a[5] AS bar -- assuming we have >= 5 rows for simplicity
FROM (
SELECT array_agg(text_col ORDER BY text_col) AS a
, count(*)::int4 AS i
FROM tbl
WHERE id BETWEEN 10 AND 100
) sub;
使用T-SQL如何最好地解决这个问题?
我能想到的最好的是两个CTE和子选择:
;WITH x AS (
SELECT row_number() OVER (ORDER BY name) AS rn
, name AS a
FROM #t
WHERE id BETWEEN 10 AND 100
)
, i AS (
SELECT count(*) AS i
FROM x
)
SELECT (SELECT a FROM x WHERE rn = 1) + (SELECT a FROM x WHERE rn = i) AS foo
, (SELECT a FROM x WHERE rn = 2) + (SELECT a FROM x WHERE rn = 5) AS bar
FROM i;
测试装置:
CREATE TABLE #t(
id INT PRIMARY KEY
, name NVARCHAR(100))
;
INSERT INTO #t VALUES
( 3, 'John')
, ( 5, 'Mary')
, ( 8, 'Michael')
, (13, 'Steve')
, (21, 'Jack')
, (34, 'Pete')
, (57, 'Ami')
, (88, 'Bob')
;
有更简单的方法吗?
3条答案
按热度按时间gwbalxhn1#
编辑1:我添加了另一个解决方案,展示了如何在SQL Server上模拟ARRAY_AGG(最后一个答案)。
编辑2:对于解决方案4),我添加了第三种连接方法。
我不确定我是否正确理解了你的问题。
a)在SQL Server中,我不使用数组,而是使用表变量或XML。
B)要连接字符串(在本例中),我将使用
SELECT @var = @var + Name FROM tbl
语句或XML xqueries
。c)基于CTE和多个子查询(
WITH cte AS () FROM SELECT (SELECT * FROM cte.rn=1) + ()...
)的解决方案将生成大量扫描和逻辑读取。解决方案:1)表格变量+
SELECT @var = @var + Name FROM tbl
:2)表格变量+
PIVOT
:3)XML + XQuery:
**4)如果问题是如何在SQL Server上模拟
ARRAY_AGG
,则一个答案可能是:使用XML。**示例:结果:
j2datikz2#
如果只是收集一些值以供重用,请尝试使用表变量而不是临时表
表变量只在内存中,而不像临时表那样在tempdb数据库中。
有关详细信息,请查看Should I use a #temp table or table variable。
2jcobegt3#
不知道这是否有帮助,但你总是可以...