2011-09-14 22 views
-2

おそらく、sqlは複雑さのレベルが上がるとめまいになります。 forループとC#で作業する方が簡単です。行のグループ化に基づいて結果セットを要約するか要約しないか

Iは

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

ようなクエリは、これは私はこの結果は同じFIELD2を有する場合要約一つの行を返すようにしたい行1、2、3、4、5、6

を返すと仮定有し、フィールド3。行のANYが異なる場合は、すべての行を戻します。

ありがとうございます。

ここにサンプルデータがあります。このlisの行番号1と4は、親アイテムと他の子アイテムです。ここで 要約すると、行番号6であるため、行1は、すべての子項目で要約されているが、行番号4は、子ども行で要約されていないが、別の値のフィールドを持つ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

ちょうど1つの行があり、子行が親行と異なる場合、このクエリは機能しません。 catcatenatedフィールドでは1つの値に過ぎませんが、まだIDを連結しています。 – WorkerThread

関連する問題