Flatten einen Re-Cord in SQL Server?
-
05-07-2019 - |
Frage
Angenommen, Sie ein Re-Cord erhalten wie folgt aus:
| ID | Foo | Bar | Red |
|-----|------|------|------|
| 1 | 100 | NULL | NULL |
| 1 | NULL | 200 | NULL |
| 1 | NULL | NULL | 300 |
| 2 | 400 | NULL | NULL |
| ... | ... | ... | ... | -- etc.
Und Sie wollen:
| ID | Foo | Bar | Red |
|-----|-----|-----|-----|
| 1 | 100 | 200 | 300 |
| 2 | 400 | ... | ... |
| ... | ... | ... | ... | -- etc.
könnten Sie so etwas wie:
SELECT
ID,
MAX(Foo) AS Foo,
MAX(Bar) AS Bar,
MAX(Red) AS Red
FROM foobarred
GROUP BY ID
Nun, wie können Sie erreichen ähnlich, wenn Foo, Bar, und Red VARCHAR sind?
| ID | Foo | Bar | Red |
|-----|----------|---------|---------|
| 1 | 'Text1' | NULL | NULL |
| 1 | NULL | 'Text2' | NULL |
| 1 | NULL | NULL | 'Text3' |
| 2 | 'Test4' | NULL | NULL |
| ... | ... | ... | ... | -- etc.
An:
| ID | Foo | Bar | Red |
|-----|----------|---------|---------|
| 1 | 'Text1' | 'Text2' | 'Text3' |
| 2 | 'Text4' | ... | ... |
| ... | ... | ... | ... | -- etc.
Derzeit arbeitet in erster Linie mit SQL Server 2000; sondern haben Zugriff auf 2005-Server.
Lösung
Ich habe keinen Zugriff auf eine SQL2K Box in der Minute aber select max (Spalte) wird Das einzige Problem im Jahr 2005 auf nvarchars funktionieren wird, wenn Sie für jede ID in Ihrer ursprünglichen Tabelle mehrere Textwerte unter jede Spalte ...
CREATE TABLE Flatten (
id int not null,
foo Nvarchar(10) null,
bar Nvarchar(10) null,
red Nvarchar(10) null)
INSERT INTO Flatten (ID, foo, bar, red) VALUES (1, 'Text1', null, null)
INSERT INTO Flatten (ID, foo, bar, red) VALUES (1, null, 'Text2', null)
INSERT INTO Flatten (ID, foo, bar, red) VALUES (1, null, null, 'Text3')
INSERT INTO Flatten (ID, foo, bar, red) VALUES (2, 'Text4', null, null)
SELECT
ID,
max(foo),
max(bar),
max(red)
FROM
Flatten
GROUP BY ID
Rückkehr
ID Foo Bar Red
----------- ---------- ---------- ----------
1 Text1 Text2 Text3
2 Text4 NULL NULL
Andere Tipps
Die Abfrage Sie oben hatte funktioniert gut für VARCHAR Felder, wie es für INT Felder haben. Das Problem mit Ihrer Anfrage ist aber, dass, wenn Sie zwei Reihen mit der gleichen ID haben, und diese beiden Reihen hatte etwas in der „Foo“ -Spalte, dann nur das eine mit dem höchsten Wert (beide für INT und VARCHAR) angezeigt wird .