5 Stimmen

Leere Zeile zwischen Gruppen von Zeilen einfügen und nach ID in Sql sortieren

Ich habe eine Tabelle mit den folgenden Spalten und Werten

ID       TYPE     NAME
1      MAJOR      RAM
2      MAJOR      SHYAM
3      MAJOR      BHOLE
4      MAJOR      NATHA
5      MINOR      JOHN
6      MINOR      SMITH

Meine Anforderung ist es, eine gespeicherte Prozedur (oder SQL-Abfrage), die die gleiche Ergebnismenge zurückgeben würde, außer dass es leere Zeile nach der TYP-Änderungen von einem Typ zu einem anderen Typ (Major, Minor).

MAJOR      RAM
MAJOR      SHYAM
MAJOR      BHOLE
MAJOR      NATHA

MINOR      JOHN
MINOR      SMITH

Während ich diese Abfrage für das Hinzufügen von leeren Zeile, aber es ist nicht auf der Grundlage der ID sortiert

select TYPE, NAME from (
select
TYPE as P1,
1 as P2,
ID,
TYPE,
NAME
from EMP
union all
select distinct
TYPE,
2,
'',
'',
N''
from EMP
) Report
order by P1, P2
go

Wie sortiere ich Daten nach ID

Vielen Dank im Voraus

1 Stimmen

Die kurze Antwort lautet, Tun Sie das nicht! Dies ist zu 100 % eine Frage der Ästhetik/Anzeige, die in Ihrer Anwendungsschicht behandelt werden muss, PAS auf der Ebene der Datenbank. Ich kann mir keinen Grund vorstellen, dies in einer Abfrage oder einem gespeicherten Prozess zu tun.

4 Stimmen

Das willkürliche Einfügen leerer Zeilen während des Select-Vorgangs ist ausgesprochen un-SQL. Wenn Sie die Informationen auf diese Weise übermitteln müssen, tun Sie es auf der Anzeigeebene in einer Skriptsprache, indem Sie den vorherigen Wert zwischenspeichern und mit dem aktuellen Wert vergleichen, während Sie eine Ergebnismenge iterieren. Verschmutzen Sie Ihr SQL nicht mit dieser Anforderung.

0 Stimmen

Dies ist ein typisches Darstellungsproblem in Reporting Services oder Crystal oder was auch immer > eine leere Fußzeile pro Gruppe Dies ist kein SQL-Problem

15voto

billinkc Punkte 56321

Ja, ja, tun Sie dies nicht, aber hier ist die Abfrage, um es zu tun, vorausgesetzt, SQL Server 2008 R2. Bei anderen Versionen/rdbms können Sie dieselbe Funktionalität erreichen, indem Sie zwei separate Abfragen schreiben, die miteinander verbunden sind.

Abfrage

; WITH DEMO (id, [type], [name]) AS
(
SELECT 1,'MAJOR','RAM'
UNION ALL SELECT 2,'MAJOR','SHYAM'
UNION ALL SELECT 3,'MAJOR','BHOLE'
UNION ALL SELECT 4,'MAJOR','NATHA'
UNION ALL SELECT 5,'MINOR','JOHN'
UNION ALL SELECT 6,'MINOR','SMITH'   
)
, GROUPED AS
(
    SELECT
        D.[type]
    ,   D.[name]
    ,   ROW_NUMBER() OVER (ORDER BY D.[type] ASC, D.[name] DESC) AS order_key
    FROM
        DEMO D
    GROUP BY
    --grouping sets introduced with SQL Server 2008 R2
    -- http://msdn.microsoft.com/en-us/library/bb510427.aspx
    GROUPING SETS
    (
        [type]
    ,   ([type], [name])
    )
)
SELECT
    CASE WHEN G.[name] IS NULL THEN NULL ELSE G.[type] END AS [type]
,   G.[name]
FROM 
    GROUPED G
ORDER BY
    G.order_key

Ergebnisse

Wenn Sie die Nullen nicht mögen, verwenden Sie coalsece, um leere Strings zu erzeugen

type    name
MAJOR   SHYAM
MAJOR   RAM
MAJOR   NATHA
MAJOR   BHOLE
NULL    NULL
MINOR   SMITH
MINOR   JOHN
NULL    NULL

2 Stimmen

Was ist mit dem Downvote? Der Benutzer muss Leerzeichen zwischen die Zeilen setzen. Ja, dafür ist die Datenbank nicht gedacht, aber diese Antwort erfüllt ihre Bedürfnisse.

0 Stimmen

Kann u tun es gleich für diese Abfrage..Ich bin nicht in der Lage, es zu tun.

0 Stimmen

Select a.Resultid,a.ResultTRID,a.TestitemId,b.TestItemName,a.ReasultValue,a.MeasurementValue,a.NormalValue,isnull(a.ItemGrouper,'-')ItemGroup,a.SerialNo from HMS_SubTestResults a,HMS_Test_Items b where a.TestitemId=b.TestItemID and a.Resultid IN (1089,1091)

1voto

Puma Punkte 126

Ich stimme mit billinkc überein. In einem sequentiellen Denken, wie dem meinen, kann es anders aussehen. Der Ansatz ist, einen Cursor zu verwenden und die Datensätze in eine temporäre Tabelle einzufügen. Diese Tabelle kann eine Spalte vom Typ INT haben, z. B. "POSITION", die bei jedem Einfügen inkrementiert wird. Überprüfen Sie, ob sich die ID ändert, und fügen Sie jedes Mal eine leere Zeile hinzu, wenn dies der Fall ist. Schließlich machen Sie die SELECT-Reihenfolge nach "POSITION".

Mein Kontext war: Eine Schnittstelle, die sich dynamisch an die Bedürfnisse des Benutzers anpasst. Einer der Bildschirme zeigt eine Zahlungstabelle, gruppiert nach Anbieter mit dem bereits erwähnten Ansatz. Ich beschloss, dies von der Datenbank aus zu verwalten und die Wartung für den Bildschirm auf der Client-Seite zu überspringen, weil jeder Anbieter unterschiedliche Zahlungsbedingungen hat.

Ich hoffe, das hilft, und wir sollten offen bleiben und nicht sagen: "Tu das nicht" oder "Dafür wurde SQL nicht entwickelt".

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X