Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[MS SQL] Group by perikelen

Pagina: 1
Acties:

  • PdeBie
  • Registratie: Juni 2004
  • Laatst online: 16:21
Hoi allen,

Ik heb een aantal rijen, die ik wil samenvoegen in een nieuwe tabel tot 1 rij.

SQL:
1
2
3
4
5
6
7
8
9
10
11
SELECT 
    tap.Code, 
    tap.Name, 
    tap.[Description],
    (CASE tap.Attribute1 WHEN 5 THEN tap.Price END) AS MinValue,
    (CASE tap.Attribute1 WHEN 6 THEN tap.Price END) AS MiddleValue,
    (CASE tap.Attribute1 WHEN 7 THEN tap.Price END) AS HighValue,
    tap.[Type], 
    c.ID AS [CountryID]
FROM 
        #TempAvailableProducts tap JOIN Country c ON tap.Country = c.CountryCode COLLATE SQL_Latin1_General_CP1_CI_AS


Geeft mij de volgende tabel

CodeNameDescriptionMinValueMiddleValueHighValueTypeCountryID
12RMDozen RosesNULL50,00NULLNULL836
12RMDozen RosesNULLNULL75,00NULL836
12RMDozen RosesNULLNULLNULL100,00836
12RMDozen RosesNULL50,00NULLNULL936
12RMDozen RosesNULLNULL75,00NULL936
12RMDozen RosesNULLNULLNULL100,00936


Dit wil ik groeperen tot:

CodeNameDescriptionMinValueMiddleValueHighValueTypeCountryID
12RMDozen RosesNULL50,0075,00100,00836
12RMDozen RosesNULL50,0075,00100,00936


Dus ik dacht:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT 
    tap.Code, 
    tap.Name, 
    tap.[Description],
    (CASE tap.Attribute1 WHEN 5 THEN tap.Price END) AS MinValue,
    (CASE tap.Attribute1 WHEN 6 THEN tap.Price END) AS MiddleValue,
    (CASE tap.Attribute1 WHEN 7 THEN tap.Price END) AS HighValue,
    tap.[Type], 
    c.ID AS [CountryID]
FROM 
        #TempAvailableProducts tap JOIN Country c ON tap.Country = c.CountryCode COLLATE SQL_Latin1_General_CP1_CI_AS
GROUP BY 
    tap.IntercatCode, 
    tap.Name, 
    tap.[Description],
    tap.Attribute1,
    tap.Price,
    tap.[Type], 
    c.ID


Maar dan krijg ik de error The text, ntext, and image data types cannot be compared or sorted, except when using IS NULL or LIKE operator.. Dit treedt op vanwege de kolom Description.
Als ik die uit de select en de group by haal, krijg ik het volgende resultaat.

CodeNameMinValueMiddleValueHighValueTypeCountryID
12RMDozen Roses50,00NULLNULL836
12RMDozen Roses50,00NULLNULL936
12RMDozen RosesNULL75,00NULL836
12RMDozen RosesNULL75,00NULL936
12RMDozen RosesNULLNULL100,00836
12RMDozen RosesNULLNULL100,00936


Hoe krijg ik het nou als gewenst? En dan het liefst incl. de description kolom, omdat die bij sommige records wel gevuld is.

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Waarom is Description een TEXT veld en niet een (N)(VAR)CHAR ? TEXT kan gebruikt worden als je heel veel data kwijt moet. Ik denk dat je het beste het datatype kunt aanpassen.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • PdeBie
  • Registratie: Juni 2004
  • Laatst online: 16:21
geen idee. Is niet mijn database. Ik moet data uit deze database importeren. Kan dus ook niet zomaar het type wijzigen helaas. Zou een Convert in de select kunnen helpen?

[ Voor 14% gewijzigd door PdeBie op 14-03-2013 15:44 ]


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 19:04

Dido

heforshe

Los daarvan, die drie kolommen die je middels die case selecteert wil je niet op groeperen in deze vorm aangezien je aparte records krijgt voor de null-values.
Iets als
code:
1
2
3
4
SUM((CASE tap.Attribute1 WHEN 7 THEN tap.Price ELSE 0 END) AS HighValue, 

...
group by Highvalue

?

Wat betekent mijn avatar?


  • DamadmOO
  • Registratie: Maart 2005
  • Laatst online: 21-11 19:40
Je kan niet groeperen op een kolom alias (en al helemaal niet als die het resultaat is van een aggregatie).

Maar de volgende code zou moeten doen wat je wilt:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT  
    tap.Code,  
    tap.Name,  
    CAST(tap.[Description] AS NVARCHAR(MAX)) AS Description, 
    MIN(CASE tap.Attribute1 WHEN 5 THEN tap.Price END) AS MinValue, 
    MIN(CASE tap.Attribute1 WHEN 6 THEN tap.Price END) AS MiddleValue, 
    MIN(CASE tap.Attribute1 WHEN 7 THEN tap.Price END) AS HighValue, 
    tap.[Type],  
    c.ID AS [CountryID] 
FROM  
        #TempAvailableProducts tap JOIN Country c ON tap.Country = c.CountryCode COLLATE SQL_Latin1_General_CP1_CI_AS 
GROUP BY  
    tap.IntercatCode,  
    tap.Name,  
    CAST(tap.[Description] AS NVARCHAR(MAX)), 
    tap.[Type],  
    c.ID

[ Voor 4% gewijzigd door DamadmOO op 14-03-2013 15:47 ]


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 19:04

Dido

heforshe

DamadmOO schreef op donderdag 14 maart 2013 @ 15:46:
Je kan niet groeperen op een kolom alias (en al helemaal niet als die het resultaat is van een aggregatie).
My bad (die alias is het probleem natuurlijk niet, maar die sum is al genoeg, dan hoef je uiteraard niet meer te groeperen. |:(

(of je sum, min of max gebruikt is natuurlijk arbitrair als er maar 1 waarde voorkomt, maar ik ken de database natuurlijk niet :P )

Sowieso moeten inderdaad de price en attribute1 uit de group by natuurlijk :)

Wat betekent mijn avatar?


  • PdeBie
  • Registratie: Juni 2004
  • Laatst online: 16:21
@DamadmOO: Die lijkt te werken inderdaad. Top!

Ik riep een Convert in mijn vorige post, maar een Cast werkt natuurlijk net zo goed (of misschien zelfs sneller).

[ Voor 55% gewijzigd door PdeBie op 14-03-2013 15:51 ]


  • DamadmOO
  • Registratie: Maart 2005
  • Laatst online: 21-11 19:40
Convert en Cast doen onder water precies hetzelfde, met als verschil dat je in een convert wat formaterings mogelijkheden hebt (voornamelijk als je vanaf een datetime naar een string gaat).
Pagina: 1