2011-09-14 69 views
-2

分组的结果可能sql在复杂度增加时让我头晕。放置for循环并在c#中工作更容易。总结或不总结基于行

我有一个像

select.field1,.field2, field3,field4 
from table1 

查询假设这个返回行1,2,3,4,5,6

我想回到总结一行,如果这一结果具有相同的场2和字段3。如果任何行不同,则返回所有行。

在此先感谢。

这是示例数据。在这个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 

希望这样更好。

+0

请显示示例数据,所需结果并指定您正在使用的SQL Server的版本。 –

+0

只需添加示例数据。是否有意义? – WorkerThread

+0

请问什么版本的SQL Server? –

回答

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; 
+0

非常感谢你。我希望我可以发出曙光来欢呼。 – WorkerThread

+1

如果你喜欢,我可以寄给你我的地址,但如果你打算送啤酒,送啤酒。 :-) –

+0

JUST FYI,当只有一行并且子行与父行不同时,此查询不起作用。它仍然将id连接在一起,尽管它只是在catcatenated领域的一个价值。 – WorkerThread