devotionMedlem sedan jan. 20013 582 inlägg 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
devotionMedlem sedan jan. 20013 582 inlägg
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 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 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
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
@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 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
@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 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 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
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 Aha! :)
Det får jag titta lite mer noga på, fattar ingenting just nu... :)
Mvh
Henrik
emissionMedlem sedan dec. 19996 721 inlägg 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.