servidor SQL: SQL selecciona varias filas como una fila

CorePress2024-01-24  10

Tabla

IDENTIFICACIÓN Fecha Modelo Precio 6255 2018-01-31 HZH98CC 435.34 6256 2018-01-31 CVVCDE7 23.24 6257 2018-01-31 WWRT423 24.24 6258 2018-02-14 DT4 43.23 6259 2018-02-14 D42C 243.2

¿Cómo puedo utilizar la consulta/vista para obtener todos los registros de la tabla de base de datos y combinar filas con la misma fecha en una sola fila? No estoy seguro de cómo empezar. Probé FOR XML pero no obtengo el resultado que quiero

SELECT DISTINCT transactions.[id], 
    SUBSTRING(
        (
            SELECT ','+ transactions.model  AS [text()]
            FROM transactions
            FOR XML PATH ('')
        ), 2, 1000) transactions
FROM transactions

Que regresa

IDENTIFICACIÓN Modelo 6255 HZH98CC,CVVCDE7,WWRT423,DT4,D42C

Resultado esperado

IDENTIFICACIÓN Fecha Modelo Precio 6255,6256,6257 2018-01-31 HZH98CC,CVVCDE7,WWRT423 435,34,23,24,24,24 6258,6259 2018-02-14 DT4,D42C 43,23.243,2

¿Es esto posible de alguna manera o tengo que hacerlo?

Select distinct [date]
From transactions Order by [date]

y usar las fechas resultantes para SELECCIONAR la coincidenciag filas y combinarlas en el código más adelante?

Necesito que todas las celdas de las filas coincidentes (es decir, filas con la misma fecha) se concatenen en la celda de esa columna.

¿Esto responde a tu pregunta? ¿Cómo concatenar texto de varias filas en una sola cadena de texto en el servidor SQL?

-Yong Shun

27 de marzo de 2021 a las 4:05

2

Puedes usar esto. https://stackoverflow.com/questions/27712374/how-to-convert-multiple-rows-to-one-row-in-sql-server

- Gowthaman

27 de marzo de 2021 a las 4:06

1

Perfeccione (o simplifique) su ejemplo de resultado esperado. Tal como están las cosas, no tiene sentido agregar las cadenas de modelos e incluir aleatoriamente solo uno de sus precios.

AlanK

27 de marzo de 2021 a las 4:28

El enlace @Gowthaman puede ser el indicado. Lo probaré y volveré

-XcOder

27 de marzo de 2021 a las 4:49



------------------------------------

Desde SQL Server 2017, SQL Server admite string_agg():

select date,
       string_agg(id, ',') within group (order by id) as ids,
       string_agg(model, ',') within group (order by id) as model,
       string_agg(price, ',') within group (order by id) as prices
from transactions
group by date;

En versiones anteriores de SQL Server, debe utilizar la solución alternativa XML.



------------------------------------

EjemploEstamos usando XML para versiones anteriores de SQL Server que no tienen la función string_agg.

DECLARE @t TABLE
    (
    id varchar(10),
    date date, 
    model varchar(10),
    price varchar(10)
    )

INSERT INTO @t
select 6255 ,'2018-01-31',  'HZH98CC',  435.34 union all
select 6256 ,'2018-01-31',  'CVVCDE7',  23.24 union all
select 6257 ,'2018-01-31',  'WWRT423',  24.24 union all
select 6258 ,'2018-02-14',  'DT4',  43.23 union all
select 6259 ,'2018-02-14',  'D42C', 243.2;

 SELECT 
  stuff( ( SELECT ','+ [id] FROM @t WHERE date = t1.date FOR XML PATH('') 
                     ),1,1,'') id,
  date,  
  stuff( ( SELECT ','+ [model] FROM @t WHERE date = t1.date FOR XML PATH('') 
                     ),1,1,'') model,
  stuff( ( SELECT ','+ [price] FROM @t WHERE date = t1.date FOR XML PATH('') 
                     ),1,1,'')  price
FROM (SELECT distinct date FROM @t ) t1

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare