このクエリからのrow concat
-
22-09-2019 - |
質問
私はこのクエリを持っています:
SELECT DISTINCT IM.EDIFICIOS_ID, TI.TITULAR
FROM IMPORTACION IM
INNER JOIN I_EDIFICIO IE ON IM.IMPORTACION_ID=IE.IMPORTACION_ID
INNER JOIN I_EDIFICIO_TITULAR ET ON IM.IMPORTACION_ID=ET.IMPORTACION_ID AND IE.EDIFICIO_ID=ET.EDIFICIO_ID
INNER JOIN I_TITULAR TI ON IM.IMPORTACION_ID=TI.IMPORTACION_ID AND ET.TITULAR_ID=TI.TITULAR_ID
WHERE TI.TITULAR IS NOT NULL AND TI.TITULAR<>''
ORDER BY IM.EDIFICIOS_ID, TI.TITULAR;
これにより、この結果セットが返されます。
EDIFICIOS_ID TITULAR
------------ ------------------
1911 Ana María García
1911 Anselmo Piedrahita
1911 Manuel López
2594 Carlos Pérez
2594 Felisa García
6865 Carlos Pérez
6865 Felisa García
8428 Carlos Pérez
各edificios_idの名目上の値を連結したいので、これを取得します。
EDIFICIOS_ID TITULAR
------------ ------------------
1911 Ana María García; Anselmo Piedrahita; Manuel López
2594 Carlos Pérez; Felisa García
6865 Carlos Pérez; Felisa García
8428 Carlos Pérez
私は使用しようとしています XMLパストリックの場合. 。私は過去にそれを使用しましたが、それがどのように機能するのか本当に理解できないので、この特定のケースにそれを適用する方法を理解することはできません。いくつかのアイデアを提供してもらえますか?
解決
このようなことを試してみてください:
DECLARE @TableA table (EDIFICIOS_ID int, TITULAR nvarchar(500))
INSERT INTO @TableA VALUES (1911 ,'Ana María García')
INSERT INTO @TableA VALUES (1911 ,'Anselmo Piedrahita')
INSERT INTO @TableA VALUES (1911 ,'Manuel López')
INSERT INTO @TableA VALUES (2594 ,'Carlos Pérez')
INSERT INTO @TableA VALUES (2594 ,'Felisa García')
INSERT INTO @TableA VALUES (6865 ,'Carlos Pérez')
INSERT INTO @TableA VALUES (6865 ,'Felisa García')
INSERT INTO @TableA VALUES (8428 ,'Carlos Pérez')
;with ResutSet AS
(
SELECT EDIFICIOS_ID,TITULAR FROM @TableA
--replace with your query here and don't use @TableA
-- SELECT DISTINCT IM.EDIFICIOS_ID, TI.TITULAR
-- FROM IMPORTACION IM
-- INNER JOIN I_EDIFICIO IE ON IM.IMPORTACION_ID=IE.IMPORTACION_ID
-- INNER JOIN I_EDIFICIO_TITULAR ET ON IM.IMPORTACION_ID=ET.IMPORTACION_ID AND IE.EDIFICIO_ID=ET.EDIFICIO_ID
-- INNER JOIN I_TITULAR TI ON IM.IMPORTACION_ID=TI.IMPORTACION_ID AND ET.TITULAR_ID=TI.TITULAR_ID
-- WHERE TI.TITULAR IS NOT NULL AND TI.TITULAR<>''
-- ORDER BY IM.EDIFICIOS_ID, TI.TITULAR;
)
SELECT
c1.EDIFICIOS_ID
,STUFF(
(SELECT
'; ' + TITULAR
FROM ResutSet c2
WHERE c2.EDIFICIOS_ID=c1.EDIFICIOS_ID
ORDER BY c1.EDIFICIOS_ID, TITULAR
FOR XML PATH('')
)
,1,2, ''
) AS CombinedValue
FROM ResutSet c1
GROUP BY c1.EDIFICIOS_ID
ORDER BY c1.EDIFICIOS_ID
出力:
EDIFICIOS_ID CombinedValue
------------ ---------------------------------------------------
1911 Ana María García; Anselmo Piedrahita; Manuel López
2594 Carlos Pérez; Felisa García
6865 Carlos Pérez; Felisa García
8428 Carlos Pérez
(4 row(s) affected)
他のヒント
これはに似ているようです この質問 そう - あなたはあなたの質問に答えるのにそれが役に立つと思うかもしれません。特にSQL ServerではなくMySQLに関するものですが、とにかくチェックしてください。
編集:
SQL Serverのgroup_concatをシミュレートする必要があるように見えます - これがそれについて議論する非常に質問です.
それがいくつかを助けることを願っています。
編集2:
しかし、それは、なぜSQLを介してではなく、クライアントアプリでこれを行うのではないのか疑問に思います。 INT値を複製した検索されたテーブルでこれを達成するのに十分簡単なことです。おそらくそれはとるべきアプローチかもしれませんか?
これは正確に +ではありませんが、MSSQLには値を連結する別の方法があります。
SELECT DISTINCT
1 AS TAG,
NULL AS PARENT,
EDIFICIOS_ID AS [EDIFICIOS!1!EDIFICIOS_ID],
NULL AS [EDIFICIOS!1!TITULAR!IDREFS]
FROM
@TABLEA
UNION ALL
SELECT DISTINCT
1 AS TAG,
NULL AS PARENT,
EDIFICIOS_ID AS [EDIFICIOS!1!EDIFICIOS_ID],
TITULAR+';' AS [EDIFICIOS!1!TITULAR!IDREFS]
FROM
@TABLEA
ORDER BY
[EDIFICIOS!1!EDIFICIOS_ID]
FOR XML EXPLICIT
所属していません StackOverflow