Json 当存在具有唯一数据的列时,如何按分组(SQL Server)

Json 当存在具有唯一数据的列时,如何按分组(SQL Server),json,sql-server,group-by,sql-server-2016,Json,Sql Server,Group By,Sql Server 2016,我正在尝试将SQL Server中具有唯一列的选定行组合在一起 目前,所有数据都被选为标准的二维表,正在排序的是Javascript,但是,对于大型列表来说,它非常慢,因为JSON非常大 我希望通过在服务器端转换数据集来提高前端性能,以便DOM呈现得更快 我认为这是可以实现的,只要结合使用SQLsgroupby函数,并可能在较新版本的sqlserver中加入一些较新的函数,如openjson 示例表 | a | b | c | uniqueColumn | |---|---|---|-----

我正在尝试将SQL Server中具有唯一列的选定行组合在一起

目前,所有数据都被选为标准的二维表,正在排序的是Javascript,但是,对于大型列表来说,它非常慢,因为JSON非常大

我希望通过在服务器端转换数据集来提高前端性能,以便DOM呈现得更快

我认为这是可以实现的,只要结合使用SQLs
groupby
函数,并可能在较新版本的sqlserver中加入一些较新的函数,如
openjson

示例表

| a | b | c | uniqueColumn  |
|---|---|---|---------------|
| 1 | 2 | 3 | string1       |
| 1 | 2 | 3 | string2       |
| 4 | 5 | 6 | string3       |
示例选择

select
uniqueColumn
group by 
a,
b,
c
| uniqueSelection1 | uniqueSelection2 |
|------------------|------------------|
| string1          | string3          |
| string2          |                  |
所需输出

select
uniqueColumn
group by 
a,
b,
c
| uniqueSelection1 | uniqueSelection2 |
|------------------|------------------|
| string1          | string3          |
| string2          |                  |

当数据集的一部分是唯一的时,如何将每个唯一的组合
a-b-c
分组到自己的集合中?

您需要使用一个函数将这些JSON连接到一列中。东西,可能,但如果您有一个较新版本的sql server,它可能是STRING_AGG。查看下面的示例

SELECT a, b, c, STUFF((SELECT N', ' + s.[CITY] FROM yourTable s 
             WHERE s.a = st.a
             AND   s.b = st.b
             AND   s.c = st.c
             FOR XML PATH(''),TYPE)
  .value('text()[1]','nvarchar(max)'),1,2,N'')
FROM yourTable st
GROUP BY a, b, c

要在上面的N个列中获得所需结果的输出,其中
N
是唯一
a、b、c
值的数量将是很困难的。您在应用程序端的处理速度可能比在SQL Server端编写和执行动态透视所需的速度要快


相反,如果您有一个较新的SQL Server,那么使用JSON AUTO的
功能可能会有所帮助,即使它与您想要的输出不完全相同:

SELECT DISTINCT (
        SELECT uniqueColumn
        FROM yourtable
        WHERE a = t.a
            AND b = t.b
            AND c = t.c
        FOR JSON AUTO
        ) AS e
FROM yourtable t;
例如:

CREATE TABLE test (a int, b int, c int, d varchar(30));
INSERT INTO test VALUES (1,2,3,'string1');
INSERT INTO test VALUES (1,2,3,'string2');
INSERT INTO test VALUES (4,5,6,'string3');
SELECT DISTINCT (SELECT d FROM test WHERE a=t.a AND b=t.b AND c=t.c FOR JSON AUTO) as e FROM test t;

+-----------------------------------+
|                 e                 |
+-----------------------------------+
| [{"d":"string1"},{"d":"string2"}] |
| [{"d":"string3"}]                 |
+-----------------------------------+


如果您想完成导致此输出的唯一
a、b、c
选择,您可以执行以下操作:

SELECT DISTINCT a,b,c, 
(SELECT d FROM test WHERE a=t.a AND b=t.b AND c=t.c FOR JSON AUTO) as e 
FROM test t
FOR JSON AUTO;

[{"a":1,"b":2,"c":3,"e":[{"d":"string1"},{"d":"string2"}]},{"a":4,"b":5,"c":6,"e":[{"d":"string3"}]}]

或者,要获得表和json的混合结果:

SELECT DISTINCT a,b,c, 
(SELECT d FROM test WHERE a=t.a AND b=t.b AND c=t.c 
FOR JSON AUTO) as e 
FROM test t;


+---+---+---+-----------------------------------+
| a | b | c |                 e                 |
+---+---+---+-----------------------------------+
| 1 | 2 | 3 | [{"d":"string1"},{"d":"string2"}] |
| 4 | 5 | 6 | [{"d":"string3"}]                 |
+---+---+---+-----------------------------------+


如果要从JSON数组中释放这些
d
输出,也可以使用
进行JSON自动,而不使用_ARRAY_WRAPPER
。最后一个查询的输出将是

[{"a":1,"b":2,"c":3,"e":"{\"d\":\"string1\"},{\"d\":\"string2\"}"},{"a":4,"b":5,"c":6,"e":"{\"d\":\"string3\"}"}]

快速解释正在发生的事情:

本质上,通过对
d
列(您的uniqueString)的子查询,我们可以执行以下操作:

SELECT a,b,c,AGGREGATE_IN_JSON(d) FROM yourtable GORUP BY a,b,c; 

只是语法要求我们在子查询中执行
AGGREGATE\u-IN\u JSON
组合公式

这个问题不是很清楚。示例查询无效,因为您仅按返回的4列中的3列进行分组,而第4列不是聚合。但理想的产出根本就不清楚。请提供帮助,以便其他人能够帮助您。@SeanLange这就是我遇到的问题。我在想,也许我可以做一个while循环,并在最后选择聚合表?这是否意味着,您要生成一个JSON输出?@Zhorov JSON只是唯一的字符串。我把它们列为JSON来帮助解释我为什么要这样做。让我更新这个问题……此外,“将每个唯一的a-b-c选择拆分为各自的表”是什么意思?“将他们加入主表”是什么意思?这里使用了很多没有定义的术语。