salve,
stavo pensando tu stessi cercando una soluzione in codice SQL, ma non mi pare questo il caso, vero?
vuoi che sposti la tua domanda in altro forum?
al di la' di questo, senza ciclare con piu' query, "forse" (dipendentemente da quante informazioni devi estrarre nel ciclo interno), in SQL Server io penserei forse anche a preaggregare direttamente il risultato in un resultset unico... nel caso (sicuramente esemplificativo) che riportavi, mi pare tu richieda come risultato proiettato {IdSessione | concatenazione_di_prodotti}
in questo caso, (di nuovo, sicuramente esemplificativo e non completo), io concatenerei Prodotti.Prodotto utilizzando la funzionalita' di proiezione FOR XML prevista in Transact-SQL, questo passando come parametro di quuery alla sub query interna di aggregazione la SessionID del carrello... quindi, con il DISTINCT(SessionID) proietto in CROSS APPLY il risultato concatenato ottenuto, ad esempio
SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE dbo.Carrello (
IdSessione int NOT NULL,
DataAggiunta datetime NOT NULL,
IdProdotto int NOT NULL
);
CREATE TABLE dbo.Prodotti (
Id int NOT NULL,
Prodotto varchar(5) NOT NULL,
PFoto varchar(5) NOT NULL
);
GO
INSERT INTO dbo.Prodotti
VALUES (1, 'p1', 'pf1'), (2, 'p2', 'pf2'), (3, 'p3', 'pf3'), (4, 'p4', 'pf4'), (5, 'p5', 'pf5');
INSERT INTO dbo.Carrello
VALUES ( 1, '2018-07-31 18:25', 1), ( 1, '2018-07-31 18:45', 2), ( 1, '2018-07-31 18:55', 3);
INSERT INTO dbo.Carrello
VALUES ( 2, '2018-07-31 18:25', 4), ( 2, '2018-07-31 18:45', 5);
INSERT INTO dbo.Carrello
VALUES ( 3, '2018-08-01 18:25', 1), ( 3, '2018-08-01 18:45', 2), ( 3, '2018-08-01 18:55', 3);
INSERT INTO dbo.Carrello
VALUES ( 4, '2018-07-31 18:25', 5), ( 4, '2018-07-31 18:45', 1);
GO
DECLARE @data date = '2018-07-31';
SELECT DISTINCT (outC.IdSessione), x.PROD
FROM dbo.Carrello outC
CROSS APPLY (
SELECT SUBSTRING(
(
SELECT CHAR(10) + p.Prodotto AS 'data()'
FROM dbo.Carrello c
JOIN dbo.Prodotti p ON p.Id = c.IdProdotto
WHERE DATEDIFF(DAY, @data, c.DataAggiunta ) = 0
AND c.IdSessione = outC.IdSessione
FOR XML PATH('')
), 2 , 9999) As PROD
) x
WHERE DATEDIFF(DAY, @data, outC.DataAggiunta ) = 0
GO
DROP TABLE dbo.Carrello, dbo.Prodotti
--<--------
IdSessione PROD
----------- -----
1 p1
p2
p3
2 p4
p5
4 p1
p5
solitamente le concatenazioni si fanno "inline" con separatore "," oppure "-", ma qui, per "tua" convenienza visto che concatenavi poi tu dal resultset interno con CRLF, ho messo come separatore CHAR(10)
non va comunque ancora bene in quanto avresti bisogno di tutto il mark up di riga, ma "mi piaceva" provare in questo senso... OK, si potrebbe comunque proporre il risultato testuale cone il mark up gia' innestato... ma non viene molto bello...
forse e' comunque meglio che ti sposto la domanda in altro forum, vero?
saluti
Modificato da Andrea Montanari il 01 agosto 2018 19.46 -