Суммировать или не суммировать результирующий набор на основе группировки строк - PullRequest
0 голосов
/ 14 сентября 2011

Вероятно, SQL вызывает головокружение при повышении уровня сложности. Проще поставить цикл и работать в c #.

У меня есть запрос типа

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

Предположим, это возвращает строки 1, 2, 3, 4, 5, 6.

Я хочу вернуть суммированную одну строку, если этот результат имеет одинаковые field2 и field3. если ЛЮБОЙ из строк отличается, вернуть все строки.

Заранее спасибо.

Вот пример данных. В этом списке строка № 1 и строка 4 - родительские элементы и другие дочерние элементы. При суммировании строка 1 суммируется со всеми дочерними элементами, но строка 4 не суммируется с дочерними строками, так как строка 6 имеет другое значение.

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 голосов
/ 14 сентября 2011

В 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

Cleanup:

DROP TABLE dbo.[Sample];
DROP FUNCTION dbo.ConcatIDs;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...