webForumDet fria alternativet

"Slå ihop" rader

ASPur ASP

16 svar · 1 059 visningar · startad av devotion

devotionMedlem sedan jan. 20013 582 inlägg
#1

Hej! :)

Jag har en tabell med följande: (exempel)

cId      Veckodag   field1   field2   field3
10010   Mån          1         500     Test
10010   Tis            1         500     Test
10010    Mån          2        500     Test
10010    Tis            2         500     Test

Jag vill på något sätt slå ihop dessa rader till:

cId     Veckodag   field1   field2   field3
10010  Mån;Tis         1        500     Test
10010  Mån;Tis        2        500     Test

Dvs där field1, field2 och field3 är lika ska det slås ihop...

Hmmm, hoppas någon fattar.... :)

Mvh
Henrik

voigtann1Medlem sedan juni 20019 519 inlägg
#2

red. läste fel.

TravoniMedlem sedan okt. 20041 556 inlägg
#3

Group by?

devotionMedlem sedan jan. 20013 582 inlägg
#4

Travoni skrev:

Group by?

Nja, det måste nog till mer än så... :)

På något sätt måste man väl loopa ut tabellen och jämföra värden, kan dock inte komma på hur... :(

Mvh
Henrik

CatZMedlem sedan jan. 20022 440 inlägg
#5

om du har ms sql server kan du titta på "case". Annars går det lösa med sub queries tror jag.

CatZMedlem sedan jan. 20022 440 inlägg
#6

Kanske något i stil med:

select field1, field2, field3 from tabell where ((field1 = field1) AND (field2 = field2))

Kan fungera?

@ndersMedlem sedan juni 200032 969 inlägg
#7

CatZ skrev:

Kanske något i stil med:

select field1, field2, field3 from tabell where ((field1 = field1) AND (field2 = field2))

Kan fungera?

Det är ju samma sak som:

select field1, field2, field3 from tabell
devotionMedlem sedan jan. 20013 582 inlägg
#8

@nders skrev:

Det är ju samma sak som:

select field1, field2, field3 from tabell

mmm...

Hur ska man göra då? :)

Kan man lösa det i SQL verkligen? Jag vill ju få in semikolon mellan Mån;Tis;Ons på den "ihopslagna raden"

Mvh
Henrik

@ndersMedlem sedan juni 200032 969 inlägg
#9

Du får loopa lite och hålla koll på variablerna som innehåller field1, field2 och field3. Om de är samma som förra gången - konkatenera lite och loopa vidare. Är de inte samma som förra gången - gör utskrift innan du tömmer variablerna och fyller dem igen.

devotionMedlem sedan jan. 20013 582 inlägg
#10

@nders skrev:

Du får loopa lite och hålla koll på variablerna som innehåller field1, field2 och field3. Om de är samma som förra gången - konkatenera lite och loopa vidare. Är de inte samma som förra gången - gör utskrift innan du tömmer variablerna och fyller dem igen.

Det lät ju enkelt. :)

Ska göra ett försök... men lär nog återkomma...

Mvh
Henrik

LarsGMedlem sedan dec. 200012 464 inlägg
#11

Det går att lösa i SQL i de flesta DBMS. Beroende på vilket DBMS som används behövs olika lösningar. I vissa system finns det en inbyggd aggregatfunktion som gör detta (sybase:list, mysql: group_concat). Om DBMS har stöd för egendefinierade funktioner går det att skriva en sådan som konkatenerar ihop värdena.

devotionMedlem sedan jan. 20013 582 inlägg
#12

Jag kör ju med MSSQL, skulle det gå där? :)

Mvh
Henrik

TravoniMedlem sedan okt. 20041 556 inlägg
Peter SMedlem sedan dec. 20025 483 inlägg
#14

Byt datatyp på Task från text till varchar(max).

En UDF:

CREATE FUNCTION RepeatAt 
(
	@contractId int,
	@repeatAmount smallint,
	@startAtMinute smallint,
	@user varchar(64),
	@task varchar(max)
)
RETURNS varchar(max)
AS
BEGIN
	DECLARE @Result varchar(max)

	SELECT
	    @Result = coalesce(@Result + ';', '') + isnull(repeatAt, '')
	FROM
	    tblContractTemplate
	WHERE
	    @contractId = contractId AND
	    @repeatAmount = repeatAmount AND
	    @startAtMinute = startAtMinute AND
	    @user  = [user] AND
	    @task = task
	    ORDER BY CASE
	        WHEN repeatAt LIKE 'M%'  THEN 1
	        WHEN repeatAt LIKE 'Ti%' THEN 2
	        WHEN repeatAt LIKE 'O%'  THEN 3
	        WHEN repeatAt LIKE 'To%' THEN 4
	        WHEN repeatAt LIKE 'F%'  THEN 5
	        WHEN repeatAt LIKE 'L%'  THEN 6
	        WHEN repeatAt LIKE 'S%'  THEN 7
	    END

	RETURN @Result
END

Sedan:

SELECT
    contractId,
    repeatAmount,
    startAtMinute,
    [user],
    dbo.RepeatAt(contractId,repeatAmount,startAtMinute,[user],task) as repeatAt,
    task
FROM
    tblContractTemplate
GROUP BY
    contractId,
    repeatAmount,
    startAtMinute,
    [user],
    task
devotionMedlem sedan jan. 20013 582 inlägg
#15

Aha! :)

Det får jag titta lite mer noga på, fattar ingenting just nu... :)

Mvh
Henrik

devotionMedlem sedan jan. 20013 582 inlägg
#16

Funkish perfectos... ;)

emissionMedlem sedan dec. 19996 721 inlägg
#17

Red: Hade visst ett gammalt fönster uppe. Bra lösning! Med SQL 2005 kan man även skapa en egen aggregatfunktion för ändamålet, gärna modellerad efter MySQL:s GROUP_CONCAT-funktion.

138 ms totalt · 3 externa anrop · v20260731065814-full.29ac60f6
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)