2016-09-08 7 views
0

私はむしろSQLを漠然とよく知っています。ObjectIdでテーブルをグループ化するにはどうすればよいですか?

私はこのテーブルを持っている2012年

SQL Serverのを使用します。

|Id | SiteId| IsNormal|  DateReview   | ObjectId |FrequencyId|InspectionId | 
|3379|  5| 1  | 2016-09-08 00:00:00.000| 1019 |  1  |  16  | 
|3380|  5| 1  | 2016-09-08 00:00:00.000| 1019 |  1  |  20  | 
|3381|  5| 0  | 2016-09-08 00:00:00.000| 1020 |  1  |  16  | 
|3382|  5| 1  | 2016-09-08 00:00:00.000| 1020 |  1  |  54  | 

少なくとも1行がgruppedテーブル内の誤った性質を持っている場合、私はそれがために持っている、のObjectIdでテーブルをgruopする必要がありますFalse。ここで、所望grouppedテーブル

|Id  | SiteId| IsNormal |  DateReview   | ObjectId |FrequencyId|InspectionId | 
|3379,3380 | 5 | 1  | 2016-09-08 00:00:00.000| 1019 |  1  |  16,20 | 
|3382,3381 | 5 | 0  | 2016-09-08 00:00:00.000| 1020 |  1  |  54,16 | 

正常で列は、ビットタイプです。

+0

理由のObjectId = 1020'あなたはIdは= 3382' '期待しても'正常で=は 'false'の場合を?それらのデータは異なる行からです....それは 'Id = 3381'ではありませんか? – Petaflop

+0

@msanz、私は自分の質問を更新したそれは間違いだった、あなたはそれをご覧ください。 – Michael

+0

あなたは解決策を試しましたか? – Tanner

答えて

2

、このようにしてみてください。

WITH Src AS 
(
    SELECT * FROM (VALUES 
    (3379, 5, CAST(1 AS bit), '2016-09-08 00:00:00.000', 1019, 1, 16), 
    (3380, 5, CAST(1 AS bit), '2016-09-08 00:00:00.000', 1019, 1, 20), 
    (3381, 5, CAST(0 AS bit), '2016-09-08 00:00:00.000', 1020, 1, 16), 
    (3382, 5, CAST(1 AS bit), '2016-09-08 00:00:00.000', 1020, 1, 54) 
    ) T(Id, SiteId, IsNormal, DateReview, ObjectId, FrequencyId, InspectionId) 
) 
SELECT Id, SiteId, IsNormal, DateReview, ObjectId, FrequencyId, InspectionId 
FROM 
(
    SELECT ObjectId, MIN(SiteId) SiteId, 
     CONVERT(bit, MIN(CONVERT(int, IsNormal))) IsNormal, 
     MIN(DateReview) DateReview, MIN(FrequencyId) FrequencyId 
    FROM Src 
    GROUP BY ObjectId 
) Dist 
CROSS APPLY 
(
    SELECT STUFF((SELECT ','+CONVERT(varchar(10),Id) 
    FROM Src 
    WHERE ObjectId=Dist.ObjectId 
    FOR XML PATH('')), 1, 1, '') 
) Ids(Id) 
CROSS APPLY 
(
    SELECT STUFF((SELECT ','+CONVERT(varchar(10),InspectionId) 
    FROM Src 
    WHERE ObjectId=Dist.ObjectId 
    FOR XML PATH('')), 1, 1, '') 
) InspectionIds(InspectionId) 
+0

Pawelありがとうございますが、IsNormal coulmnはビットタイプ – Michael

+0

です。例が修正されました。 –

+0

こんにちはPawel.Anyのアイデアは上記のクエリをスピードアップすることは可能ですか? CROSS APPLYには時間がかかります。 – Michael

1

次を使用でき

DECLARE @Table TABLE (
    Id INT 
    ,SiteId INT 
    ,IsNormal bit 
    ,DateReview DATETIME 
    ,ObjectId INT 
    ,FrequencyId INT 
    ,InspectionId INT 
    ) 

Insert into @Table values 
(3379,5,1, '2016-09-08 00:00:00.000',1019,1,16) 
,(3380,5,1, '2016-09-08 00:00:00.000',1019,1,20) 
,(3381,5,0,'2016-09-08 00:00:00.000',1020,1,16) 
,(3382,5,1, '2016-09-08 00:00:00.000',1020,1,54) 

SELECT STUFF((
      SELECT ',' + convert(VARCHAR(10), Id) 
      FROM @Table t 
      WHERE t.ObjectId = t1.objectid 
      FOR XML PATH('') 
      ), 1, 1, '') AS Id 
    ,siteid 
    ,CASE 
     WHEN STUFF((
        SELECT ',' + convert(VARCHAR(10), IsNormal) 
        FROM @Table t 
        WHERE t.ObjectId = t1.objectid 
        FOR XML PATH('') 
        ), 1, 1, '') LIKE '%0%' 
      THEN 0 
     ELSE 1 
     END AS IsNormal 
    ,datereview 
    ,objectid 
    ,FrequencyId 
    ,STUFF((
      SELECT ',' + convert(VARCHAR(10), InspectionId) 
      FROM @Table t 
      WHERE t.ObjectId = t1.objectid 
      FOR XML PATH('') 
      ), 1, 1, '') AS InspectionId 
FROM @Table t1 
GROUP BY siteid 
    ,datereview 
    ,objectid 
    ,FrequencyId 
+0

助けていただきありがとうございます。私は私の質問にビット列とstring.cでない場合、私の質問でいくつかの間違いをしました。 – Michael

関連する問題