1

テーブルGroupingからテーブルGroupid(PK)、Sensorid(FK)がありSensorます。また、Sensorテーブルには外部キー参照としてUnitsidがあります。そこで、このクエリを使用して、3つのテーブルからすべての列を取得しました。

  Select * from Grouping
  left join Sensors on Grouping.SensorID = Sensors.SensorID
  left joinUnits on Grouping.UnitsID = Units.UnitsID 

出力:

Group  Unit    Sensor
G1  U1  S1
G1  U2  S2
G1  U1  S4
G1  U1  S3
G1  U2  S5
G2  U1  S7

私の問題は、次のような出力が必要なことです。

G1  U1  S1,S3,S4
G1  U2  S2,S5
G2  U1  S7

'Grouping'テーブルからこの出力を取得するにはどうすればよいですか?

WITH CTE
AS
(
   Select * fromGrouping
  left join Sensors on Grouping.SensorID = Sensors.SensorID
  left join Units onGrouping.UnitsID = Units.UnitsID 
)
SELECT 
  t1."Group",
  t1.Unit ,
  STUFF((
    SELECT ', ' + t2.Sensor  
    FROM Grouping  t2
    WHERE t2."Group" = t1."Group"
      AND t2.Unit = t1.Unit
    FOR XML PATH (''))
  ,1,2,'') AS Sensors
FROM Grouping  t1
GROUP BY t1."Group", t1.Unit;

グループ化テーブルにはsensorIdとunitsIdしかないため、これは機能しません。そのため、無効な列エラーがスローされます。

4

1 に答える 1

1

SQL Server には、これを行う組み込みの方法はありませんが、 を使用しFOR XMLてこれを行うことができます。

WITH CTE
AS
(
  -- Put your query here
)
SELECT 
  t1."Group",
  t1.Unit ,
  STUFF((
    SELECT ', ' + t2.Sensor  
    FROM CTE t2
    WHERE t2."Group" = t1."Group"
      AND t2.Unit = t1.Unit
    FOR XML PATH (''))
  ,1,2,'') AS Sensors
FROM CTE t1
GROUP BY t1."Group", 
         t1.Unit;

SQL フィドルのデモ

これにより、次のことが得られます。

| GROUP | UNIT |    SENSORS |
-----------------------------
|    G1 |   U1 | S1, S4, S3 |
|    G1 |   U2 |     S2, S5 |
|    G2 |   U1 |         S7 |
于 2013-02-07T07:34:47.290 に答える