Benutzer mit den meisten Antworten
Probleme beim Gruppieren von ntext-Feldern in Views

Frage
-
Hallo zusammen,
wir - also auch meine Kollegen - haben immer wieder dasselbe Problem, wenn wir SQL-Abfragen/Views über Tabellen einer bestimmten kaufmännischen Standardsoftware machen.
Es gibt Textfelder, die sollten unbedingt in die Abfragen rein, aber der SQL Server (bspw. 2012) schimpft, weil ntext-Felder usw. nicht gruppiert werden dürften.
Gibt es dafür Lösungsmöglichkeiten?
Bspw. benötige ich die aufaddierten Umsatzwerte ... SUM(Umsatz) AS SUMME_UMSATZ ... gruppiert nach Projekt, aber die Projektbezeichnung soll halt auch mit rein, nicht nur die Projektnummer. Möchte der Kunde so haben.
Der SQL Server aber schimpft, das sei ein zu großes Textfeld und dürfe daher nicht gruppiert werden.
Kennt jemand das Problem bzw. hat eine Lösung dafür?
Gruß und ein wunderschönes Wochenende
Thomas
- Bearbeitet tschroeder1973 Samstag, 21. Februar 2015 07:44
Antworten
-
Hallo Thomas,
der Cast soll helfen, dort wo Du Aktuell die entsprechenden Spalten selektierst ,gruppierst
kann ein CAST(deineSpalte as Varchar(100) ) as deinSpaltenname im select
und ein Group by CAST(deineSpalte as Varchar(100) ) helfen.Grüße Alexander
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 24. Februar 2015 10:19
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 3. März 2015 07:51
-
Hallo Thomas,
LOB Felder können grundsätzlich nicht gruppiert werden, ... das wäre etwas viel verlangt (bis zu 2GB) Daten zu vergleichen, um eine Gruppe zu bilden; GROUP BY (und ORDER BY) erlauben max. 8060 Bytes.
Das ist auch nicht nötig, da man zusätzliche Daetn über Konstrukte wie Fensterfunktionen oder APPLY abrufen kann, für eine einzelne Spalte reicht eine Unterabfrage. Zwei einfache Varianten für die Northwind (Description ist NTEXT):
SELECT CategoryID, (SELECT [Description] FROM dbo.Categories AS c WHERE p.CategoryID = c.CategoryID) AS [Description], SUM(UnitPrice * UnitsInStock) AS Summe FROM dbo.Products AS p GROUP BY CategoryID; SELECT p.*, cn.* FROM (SELECT CategoryID, SUM(UnitPrice * UnitsInStock) AS Summe FROM dbo.Products GROUP BY CategoryID) AS p CROSS APPLY (SELECT CategoryName, [Description] FROM dbo.Categories AS c WHERE c.CategoryID = p.CategoryID) AS cn;
und etliche andere Möglichkeiten existieren, je nach Anforderung.
Das sollte man auch in Fällen verwenden, wo die "übrigen" Felder in ein GROUP BY reinpassen würden, denn das Gruppieren umfangreicher Daten ist oft langsamer als eine zusätzliche Abfrage. Alles in ein GROUP BY "rein zu stopfen" ist oft nur die Folge von Bequemlichkeit (oder der Limitation von sog. Abfrage-Editoren).
Gruß Elmar
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 24. Februar 2015 10:20
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 3. März 2015 07:46
Alle Antworten
-
Hallo Thomas,
der Cast soll helfen, dort wo Du Aktuell die entsprechenden Spalten selektierst ,gruppierst
kann ein CAST(deineSpalte as Varchar(100) ) as deinSpaltenname im select
und ein Group by CAST(deineSpalte as Varchar(100) ) helfen.Grüße Alexander
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 24. Februar 2015 10:19
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 3. März 2015 07:51
-
Hallo Thomas,
LOB Felder können grundsätzlich nicht gruppiert werden, ... das wäre etwas viel verlangt (bis zu 2GB) Daten zu vergleichen, um eine Gruppe zu bilden; GROUP BY (und ORDER BY) erlauben max. 8060 Bytes.
Das ist auch nicht nötig, da man zusätzliche Daetn über Konstrukte wie Fensterfunktionen oder APPLY abrufen kann, für eine einzelne Spalte reicht eine Unterabfrage. Zwei einfache Varianten für die Northwind (Description ist NTEXT):
SELECT CategoryID, (SELECT [Description] FROM dbo.Categories AS c WHERE p.CategoryID = c.CategoryID) AS [Description], SUM(UnitPrice * UnitsInStock) AS Summe FROM dbo.Products AS p GROUP BY CategoryID; SELECT p.*, cn.* FROM (SELECT CategoryID, SUM(UnitPrice * UnitsInStock) AS Summe FROM dbo.Products GROUP BY CategoryID) AS p CROSS APPLY (SELECT CategoryName, [Description] FROM dbo.Categories AS c WHERE c.CategoryID = p.CategoryID) AS cn;
und etliche andere Möglichkeiten existieren, je nach Anforderung.
Das sollte man auch in Fällen verwenden, wo die "übrigen" Felder in ein GROUP BY reinpassen würden, denn das Gruppieren umfangreicher Daten ist oft langsamer als eine zusätzliche Abfrage. Alles in ein GROUP BY "rein zu stopfen" ist oft nur die Folge von Bequemlichkeit (oder der Limitation von sog. Abfrage-Editoren).
Gruß Elmar
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 24. Februar 2015 10:20
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 3. März 2015 07:46
-
Workarounds hast Du nun :)
Bitte nimm es als Anlass, den Hersteller der Anwendung daran zu erinnern, sein System zukunftsfähig zu machen. text/ntext/image sind seit SQL Server 2005 aus gutem Grunde deprecated. Die seitdem aktuellen Datentypen n/varchar(max) sind performanter und flexibler.
Andreas Wolter (Blog | Twitter)
MCSM: Microsoft Certified Solutions Master Data Platform, MCM, MVP
www.SarpedonQualityLab.com | www.SQL-Server-Master-Class.com -
Hallo Thomas,
Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben. Solltest Du noch Rückfragen dazu haben, gib bitte Bescheid.
Gruß,
DimitarBitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.