Dusan Kolesar wrote:
>
> On Mon, 31 Oct 2005 15:14:15 +0100, Zabach, Elke <[EMAIL PROTECTED]>
> wrote:
>
> > Dusan Kolesar wrote:
> >
> >>
> >> Hello list,
> >> Is it posible to do in SAP DB something like:
> >> SELECT CONCAT (column1 || ', ') FROM t1 GROUP BY column2
> >>
> >> Manual says:
> >> The GROUP clause allows the functions SUM, AVG, MAX/MIN, COUNT,
STDDEV,
> >> and VARIANCE
> >> to be applied not only to entire result tables but also to groups
of
> >> rows
> >> within a result table.
> >>
> >> Or is there any other way how to obtain such a result?
> >> Thank you for your support.
> >>
> >
> > If a GROUP BY - clause is given, every column has to be part of this
> > clause OR part of a aggregate function like SUM/MIN/MAX/COUNT/...
> >
> > --> your select is not possible. And, by the way, what should the
> > semantic be if all rows with the same column2-value are put together
and
> > one of the column1-values is used to produce the output for the
> > corresponding resultrow? Which column1-value ????
> >
> > Which problem do you want to solve?
> >
> > Elke
> > SAP Labs Berlin
> >
> >
> >> Dusan
> >>
>
> Hello, Elke
> let me describe you my situation.
> I have tables:
> //
> CREATE TABLE "STATION"
> (
> "ID" Integer NOT NULL DEFAULT SERIAL,
> "NAME" Varchar(30) ASCII NOT NULL DEFAULT '',
> PRIMARY KEY ("ID")
> )
> //
> CREATE TABLE LINE
> (
> "ID" Integer NOT NULL DEFAULT SERIAL,
> "NAME" Varchar(10) ASCII NOT NULL DEFAULT '',
> PRIMARY KEY ("ID")
> )
> //
> CREATE TABLE STATION_LINE_REL
> (
> "LINE_ID" Integer NOT NULL,
> "STATION_ID" Integer NOT NULL,
> "STATIONORDER" Integer NOT NULL DEFAULT 1
> CONSTRAINT "STATIONORDER" > 0,
> FOREIGN KEY "LINE_ID" ("LINE_ID")
> REFERENCES "LINE" ("ID") ON DELETE CASCADE,
> FOREIGN KEY "STATION_ID" ("STATION_ID")
> REFERENCES "STATION" ("ID") ON DELETE CASCADE
> )
> //
> INSERT STATION (ID, NAME) VALUES (1, 'ST1')
> //
> INSERT STATION (ID, NAME) VALUES (2, 'ST2')
> //
> INSERT STATION (ID, NAME) VALUES (3, 'ST3')
> //
> INSERT STATION (ID, NAME) VALUES (4, 'ST4')
> //
> INSERT LINE (ID, NAME) VALUES (1, 'L1')
> //
> INSERT LINE (ID, NAME) VALUES (2, 'L2')
> //
> INSERT STATION_LINE_REL (LINE_ID, STATION_ID, STATIONORDER) VALUES (1,
1,
> 1)
> //
> INSERT STATION_LINE_REL (LINE_ID, STATION_ID, STATIONORDER) VALUES (1,
2,
> 2)
> //
> INSERT STATION_LINE_REL (LINE_ID, STATION_ID, STATIONORDER) VALUES (1,
3,
> 3)
> //
> INSERT STATION_LINE_REL (LINE_ID, STATION_ID, STATIONORDER) VALUES (2,
2,
> 1)
> //
> INSERT STATION_LINE_REL (LINE_ID, STATION_ID, STATIONORDER) VALUES (2,
4,
> 2)
> //
>
> So between station and line is N:N relation.
> Line L1 : ST1, ST2, ST3
> Line L2 : ST2, ST4
>
> I need make a list of station for 1 station only 1 row
> with lines description column (LINES) = all lines on which station
lies.
> ID NAME NUMLINES LINES
> 1 ST1 1 L1
> 2 ST2 2 L1, L2
> 3 ST3 1 L1
> 4 ST4 1 L2
>
If you always can assure that not more than 2 lines will stop at the
same station, some kind of (outer) join may help.
I did not think of that case, but wanted to assure a correct result for
as many lines per station as are in reality.
The resulting query looks a 'little bit' different:
DECLARE C CURSOR FOR
WITH RECURSIVE PX (ID, NUMLINES, LINES, LAST_LINE) AS
(SELECT STATION_ID, 1, NAME, LINE.ID
FROM STATION_LINE_REL, LINE
WHERE STATION_LINE_REL.LINE_ID = LINE.ID
AND (STATION_ID,LINE_ID) = ANY
(SELECT STATION_ID, MIN(LINE_ID) FROM STATION_LINE_REL
GROUP BY STATION_ID)
UNION ALL
SELECT PX.ID, NUMLINES+1, LINES||', '|| NAME,
STATION_LINE_REL.LINE_ID
FROM STATION_LINE_REL, LINE, PX
WHERE STATION_LINE_REL.LINE_ID = LINE.ID
AND PX.ID = STATION_LINE_REL.STATION_ID
AND PX.LAST_LINE < STATION_LINE_REL.LINE_ID
)
SELECT PX.ID, STATION.NAME, FIXED(NUMLINES, 2), LINES
FROM PX, STATION
WHERE (PX.ID, NUMLINES) = ANY
(SELECT STATION_ID, COUNT(*)
FROM STATION_LINE_REL
GROUP BY STATION_ID)
AND PX.ID = STATION.ID
ORDER BY PX.ID
But it works (tested with an additional line 3 stopping at station 2)
Good luck
Elke
SAP Labs Berlin
> SELECT STATION.ID, MIN (STATION.NAME)AS NAME,
> COUNT (STATION_LINE_REL.LINE_ID) AS NUMLINES
> /* CONCAT (LINE.NAME || ', ') AS LINES */
> FROM STATION
> LEFT JOIN STATION_LINE_REL ON STATION_LINE_REL.STATION_ID =
> STATION.ID
> GROUP BY STATION.ID
>
> And from other side lines list with station description colunm.
> Is it posible to find some elegant solution for this?
>
> Thank you, Dusan
>
> --
> Dusan Kolesar
> Helsinska 19
> 040 13 Kosice
> Slovakia
> e-mail : [EMAIL PROTECTED]
> ICQ# : 160507424
--
MaxDB Discussion Mailing List
For list archives: http://lists.mysql.com/maxdb
To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]