Hay tres columnas, donde D_ID = 13, value_amount tiene el valor para el modo de pago y donde D_ID = 10, value_amount tiene el valor para el monto.

ID D_ID Value_amount
1   13   2
1   13   2
1   10   1500
1   10   1500
2   13   1
2   13   1
2   10   2000
2   10   2000

Ahora tengo que agregar dos columnas más, monto y modo_de_pago y el resultado debería aparecer como a continuación

ID  amount mode_of_payment
1   1500  2
1   1500  2
2   2000  1
2   2000  1
0
Mini 9 feb. 2021 a las 19:19

1 respuesta

La mejor respuesta

Esto es demasiado largo para un comentario.

En pocas palabras, sus datos tienen graves defectos. Para los datos de ejemplo que ha proporcionado, está "bien", porque las filas tienen los mismos valores para el mismo ID, pero ¿qué pasa cuando no? Supongamos, por ejemplo, que tenemos datos que se ven así:

ID D_ID  Value_amount
1   13   1           --1
1   13   2           --2
1   10   1500        --3
1   10   1000        --4
2   13   1           --5
2   13   2           --6
2   10   2000        --7
2   10   3000        --8

Agregué un "número de fila" junto a los datos, solo con fines de demostración.

Aquí, ¿con qué fila está relacionada la fila "1"? ¿Fila "3" o fila "4"? ¿Cómo lo sabes? No siempre hay un valor ascendente en sus datos, por lo que la fila "3" podría fácilmente ser la fila "4". De hecho, si tuviéramos que ordenar los datos usando ID ASC, D_ID DESC, Value_amount ASC, las filas 3 y 4 se "intercambiarían" en orden. Esto podría significar que cuando intenta una solución, el orden es incorrecto.

Las tablas no se almacenan en ningún orden en particular, que están desordenadas. Lo que determina el orden en el que se presentan los datos es la cláusula ORDER BY, y si no tiene un valor para definir ese "orden", entonces ese "orden" se pierde tan pronto como INSERT eso.

Sin embargo, si agregamos un valor siempre ascendente a sus datos, puede lograrlo.


CREATE TABLE dbo.YourTable (UID int IDENTITY,
                            ID int,
                            DID int,
                            Value_amount int);
GO
INSERT INTO dbo.YourTable (ID, DID, Value_amount)
VALUES (1,13,1   ),
       (1,13,2   ),
       (1,10,1500),
       (1,10,1000),
       (2,13,1   ),
       (2,13,2   ),
       (2,10,2000),
       (2,10,3000);
GO

WITH RNs AS(
    SELECT ID,
           DID,
           Value_amount,
           ROW_NUMBER() OVER (PARTITION BY ID, DID ORDER BY UID ASC) AS RN
    FROM dbo.YourTable)
SELECT ID,
       MAX(CASE DID WHEN 13 THEN Value_Amount END) AS Amount,
       MAX(CASE DID WHEN 10 THEN Value_Amount END) AS PaymentMode
FROM RNs
GROUP BY RN,
         ID;

GO
DROP TABLE dbo.YourTable;

Por supuesto, necesitas corregir tu diseño para implementar esto, pero necesitas hacerlo de todos modos.

1
Larnu 9 feb. 2021 a las 16:34