تتسطح مجموعة سجلات في SQL Server؟
-
05-07-2019 - |
سؤال
ونقول لكم الحصول على السجلات كما يلي:
| ID | Foo | Bar | Red |
|-----|------|------|------|
| 1 | 100 | NULL | NULL |
| 1 | NULL | 200 | NULL |
| 1 | NULL | NULL | 300 |
| 2 | 400 | NULL | NULL |
| ... | ... | ... | ... | -- etc.
وتريد:
| ID | Foo | Bar | Red |
|-----|-----|-----|-----|
| 1 | 100 | 200 | 300 |
| 2 | 400 | ... | ... |
| ... | ... | ... | ... | -- etc.
هل يمكن استخدام شيء من هذا القبيل:
SELECT
ID,
MAX(Foo) AS Foo,
MAX(Bar) AS Bar,
MAX(Red) AS Red
FROM foobarred
GROUP BY ID
والآن، كيف يمكن لك إنجاز مماثل عندما فو، بار، والأحمر هي VARCHAR؟
| ID | Foo | Bar | Red |
|-----|----------|---------|---------|
| 1 | 'Text1' | NULL | NULL |
| 1 | NULL | 'Text2' | NULL |
| 1 | NULL | NULL | 'Text3' |
| 2 | 'Test4' | NULL | NULL |
| ... | ... | ... | ... | -- etc.
ل:
| ID | Foo | Bar | Red |
|-----|----------|---------|---------|
| 1 | 'Text1' | 'Text2' | 'Text3' |
| 2 | 'Text4' | ... | ... |
| ... | ... | ... | ... | -- etc.
ويعمل حاليا في المقام الأول مع SQL Server 2000؛ ولكن الحصول على خوادم عام 2005.
المحلول
وأنا لا يستطيعون الوصول إلى مربع SQL2K في اللحظة ولكن حدد الحد الأقصى (عمود) ستعمل على nvarchars في عام 2005. والمشكلة الوحيدة ستكون إذا كان لديك قيم نصية متعددة تحت كل عمود لكل معرف في الجدول الأصلي ...
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
وعوائد
ID Foo Bar Red
----------- ---------- ---------- ----------
1 Text1 Text2 Text3
2 Text4 NULL NULL
نصائح أخرى
والاستعلام كان لديك أعلاه يعمل على ما يرام لحقول VARCHAR كما فعلت لحقول INT. المشكلة مع الاستعلام الخاص بك هو على الرغم من أن إذا كان لديك صفين مع نفس الهوية، وكلا من تلك الصفوف كان شيئا في عمود "فو"، وعندئذ فقط واحد وفقا لأعلى قيمة (سواء بالنسبة للINT وVARCHAR) سيتم عرضها .