2

私はテーブルを持っていますProjectMaster

  Id       ProjectName
  1         A
  2         B
  3         C

別のテーブルProjectMeter

 Id   ProjectId   MeterNumber
 1      1          #0001
 2      1          #0002
 3      1          #0003 
 4      2          #0004
 5      2          #0005 
 6      3          #0006

次の出力が欲しい

ProjectName   MeterNumbers 
 A             #0001, #0002, #0003
 B             #0004, #0005
 C             #0006

これこれを試しましたが、問題を解決できませんでした。テーブル変数を使用できません。

私はすでにストアドプロシージャを作成していて、多くのjoinedテーブルからデータを取得しています。ProjectMasterも、たまたまこれらのテーブルの1つに参加しています。ここで、ProjectMeterからデータをフェッチする必要があります。これにより、各行は、その列のProjectIdに対応するProjectMeter.MeterNumberを連結します。

現在、すべての行のすべてのメーター番号の連結リストを取得しています。

I cannot use CURSOR, TABLE variable , Temp TABLE 

(私はまだ私の目的のために何かができることを願っています)

助けてください.....

4

3 に答える 3

4

これを試して:

SELECT projectname, STUFF((SELECT distinct ', ' + meternumber 
              from projectmeter m
              where p.id = m.projectid
            FOR XML PATH(''), TYPE

            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'') MeterNumbers
from projectmaster p

SQL FiddlewithDemoを参照してください

于 2012-08-29T13:57:44.110 に答える
1
DECLARE @ProjectMaster AS TABLE
    (
      ID INT IDENTITY(1, 1) ,
      ProjectName VARCHAR(2)
    )
DECLARE @ProjectMeter AS TABLE
    (
      ID INT IDENTITY(1, 1) ,
      ProjectID INT ,
      MeterNumber VARCHAR(50)
    )

INSERT  INTO @ProjectMaster
        ( ProjectName )
VALUES  ( 'A' )

INSERT  INTO @ProjectMeter
        ( ProjectID, MeterNumber )
VALUES  ( 1, '#0001' )
INSERT  INTO @ProjectMeter
        ( ProjectID, MeterNumber )
VALUES  ( 1, '#0002' )

SELECT pMaster.ID, STUFF(( SELECT  ',' + MeterNumber
                FROM    @ProjectMeter
              FOR
                XML PATH('')
              ), 1, 1, '') AS 'Concat Result'
FROM    @ProjectMeter pMeter
        INNER JOIN @ProjectMaster pMaster ON pMaster.ID = pMeter.ProjectID
GROUP BY pMaster.ID

ここではテーブル変数を使用しましたが、指定したのと同じテーブル名を使用したので、@を削除する必要がありますか?これが大丈夫かどうかわかりませんか?:)

于 2012-08-29T13:58:17.343 に答える
1

また、MS SQLでは、CTEで再帰クエリを使用してこれを行うことができます。

これがSQLFiddleのデモです

;with t1 as (
 select t.*,
        cast(meternumber as varchar(max)) as m2,
        0 as level
     from ProjectMeter t 
     where not exists 
        (select id 
                from ProjectMeter l 
          where l.id<t.id and l.ProjectId=t.ProjectID 
        )
 union all
 select b.*,
        cast(c.m2+','+b.MeterNumber as varchar(max)) as m2,
        c.level+1 as level
     from ProjectMeter b
         inner join t1 c
             on (c.id < b.id) and (b.ProjectID=c.ProjectId)

)

select pm.ProjectName as ProjectName, 
       t1.m2 as MeterNumbers 
      from t1 
      inner join
        (select ProjectId,max(level) ml 
              from t1 
          group by ProjectId
        ) t2  
            on (t1.ProjectId=t2.ProjectID) and (t1.level=t2.ml)
       left join ProjectMaster pm 
           on (t1.ProjectId=pm.Id)
order by t1.ProjectID
于 2012-08-29T15:02:56.960 に答える