2011-09-14 72 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