总结或不总结基于行分组的结果集

时间:2011-09-14 18:38:40

标签: sql sql-server tsql grouping

当复杂程度增加时,sql可能让我头晕目眩。使用for循环并在c#中工作更容易。

我有一个像

这样的查询
select.field1,.field2, field3,field4
from table1 

假设这会返回第1,2,3,4,5,6行。

如果此结果具有相同的field2和field3,我想返回汇总的一行。如果任何行不同,则返回所有行。

提前致谢。

这是样本数据。在这个lis行中,第1行和第4行是父项和其他子项。 汇总时,第1行与所有子项汇总,但第4行未汇总为子行,因为第6行具有不同的值字段2.

Field1 Field2 Field3 Field4(parentid)
1      paper cash    null
2      Paper cash     1
3      paper cash     1
4      paper cash     null
5      paper cash     4
6      pen    cash    4

我想返回

field1  Field2 Field3  field4(all the child's id)
1       paper cash     (2,3)
4       paper cash     null
5       paper cash     null
6       pen cash     null 

希望这更好。

1 个答案:

答案 0 :(得分:0)

使用SQL Server,您必须创建一个函数来协助连接,并使用#temp表来协助后处理(以避免在整个源表中重复调用该函数)。如果您迁移到过去10年发布的数据库平台,您将获得更有效的解决方案触手可及。 : - )

设定:

USE tempdb;
GO

CREATE TABLE dbo.[Sample]
(
    Field1 INT, 
    Field2 VARCHAR(32),
    Field3 VARCHAR(32), 
    Field4 INT
);

INSERT dbo.[Sample] SELECT 1,'paper','cash', NULL
UNION ALL   SELECT 2,'Paper','cash', 1
UNION ALL   SELECT 3,'paper','cash', 1
UNION ALL   SELECT 4,'paper','cash', NULL
UNION ALL   SELECT 5,'paper','cash', 4
UNION ALL   SELECT 6,'pen',  'cash', 4;
GO

功能:

CREATE FUNCTION dbo.ConcatIDs
(
  @Field1 INT
)
RETURNS VARCHAR(8000)
AS
BEGIN
    DECLARE @s VARCHAR(8000);
    SELECT @s = COALESCE(@s + ',', '')
        + CONVERT(VARCHAR(12), Field1)
      FROM dbo.[Sample] AS s
      WHERE Field4 = @Field1 
      AND NOT EXISTS
      (
        SELECT 1
          FROM dbo.[Sample]
          WHERE Field4 = s.Field4
          AND Field1 <> s.Field1
          AND (Field2 <> s.Field2 OR Field3 <> s.Field3)
      );
    RETURN @s;
END
GO

查询:

SELECT Field1, Field2, Field3, Field4, f4 = dbo.ConcatIDs(Field1) 
  INTO #x
  FROM dbo.[Sample];

SELECT Field1, Field2, Field3, 
  [field4(all the child's id)] = '(' + f4 + ')'
FROM #x AS x1
WHERE NOT EXISTS 
(
    SELECT 1 FROM #x AS x2
    WHERE x2.Field1 = x1.Field4
    AND x2.f4 IS NOT NULL
);

DROP TABLE #x;

结果:

Field1 Field2 Field3 field4(all the child's id)      
------ ------ ------ --------------------------
1      paper  cash   (2,3)
4      paper  cash   NULL
5      paper  cash   NULL
6      pen    cash   NULL

清理:

DROP TABLE dbo.[Sample];
DROP FUNCTION dbo.ConcatIDs;