当复杂程度增加时,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
希望这更好。
答案 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;