2016-05-31 23 views
3

Ich habe eine Tabelle, die Kunden enthält (Ziel dieser Tabelle war es, Felder ohne DB-Update hinzufügen zu können). Die Tabelle sieht wie folgt aus:Wie schreibe ich die Abfrage?

CustId  Property  PropertyValue 

1   Name   Smith 
1   Email  [email protected] 
2   Name   Donalds 
2   Email  [email protected] 
3   Name   john 

(Der Kunde 3 hat keinen Eintrag für „E-Mail“ in der Tabelle)

Erwartetes Ergebnis: ich eine Zeile pro Client (Mail) erhalten möchte und wenn der Kunde hat keine E-Mail, zeige noch eine Zeile mit NULL an.

CustId  Property  PropertyValue 

1   Email  [email protected] 
2   Email  [email protected] 
3   Email  NULL 

Hat jemand die Lösung?

+4

Können Sie die SQL teilen Sie bisher versucht haben? –

Antwort

4
DECLARE @t TABLE (
    CustId INT, 
    Property VARCHAR(50), 
    PropertyValue VARCHAR(50) 
) 
INSERT INTO @t (CustId, Property, PropertyValue) 
VALUES 
    (1, 'Name', 'Smith'), 
    (1, 'Email', '[email protected]'), 
    (2, 'Name', 'Donalds'), 
    (2, 'Email', '[email protected]'), 
    (3, 'Name', 'john') 

SELECT CustId 
    , Name = 'Email' 
    , Value = MAX(CASE WHEN Property = 'Email' THEN PropertyValue END) 
FROM @t 
GROUP BY CustId 
+0

Mmm, das ist nicht, was er fragte – sagi

+0

@sagi ja, ein kleiner Fehler von meiner Seite :) bereits aktualisiert – Devart

+0

Bessere Lösung dann alle von uns :) – sagi

3

Sie können es eine abgeleitete Tabelle mit allen möglichen ID ‚s enthält, und dann links nur auf die E-Mails auf dem Originaltisch verbindet:

SELECT t.custID,'EMAIL',s.PropertyValue 
FROM(SELECT DISTINCT custID 
    FROM YourTable) t 
LEFT OUTER JOIN YourTable s 
ON(t.custID = s.custID and s.property = 'Email') 

Kann auch mit einer korrelierten Abfrage erfolgen:

SELECT DISTINCT t.CustID,'EMAIL', 
     (SELECT s.PropertyValue 
     FROM YourTable s 
     WHERE s.custID = t.custID and s.Property = 'Email') 
FROM YourTable t 
+0

Ihre erste Abfrage führt zu dem folgenden Fehler: 'Ungültiger Spaltenname 'property'.' Ihre zweite Abfrage funktioniert wie vorgesehen. – HappyCoding

+1

@HappyCoding Danke, Tippfehler. Mixed 's' mit' t' – sagi

5

Abfrage 1

Select t1.CustId 
    , ISNULL(t2.Property ,'Email') AS Property 
    , t2.PropertyValue 
FROM TableName t1 
LEFT JOIN TableName t2 ON t1.CustId = t2.CustId 
         AND t2.Property = 'Email' 
WHERE t1.Property = 'Name' 

Ergbnisssatzes 1

╔════════╦══════════╦═══════════════════╗ 
║ CustId ║ Property ║ PropertyValue ║ 
╠════════╬══════════╬═══════════════════╣ 
║  1 ║ Email ║ [email protected] ║ 
║  2 ║ Email ║ [email protected] ║ 
║  3 ║ Email ║ NULL    ║ 
╚════════╩══════════╩═══════════════════╝ 

Abfrage 2

Eine weitere Abfrage für einen lesbaren Ergebnismenge sollte so etwas aussehen ....

Select t1.CustId 
    , t1.PropertyValue [CustomerName] 
    , t2.PropertyValue [CustomerEmail] 
FROM TableName t1 
LEFT JOIN TableName t2 ON t1.CustId = t2.CustId 
         AND t2.Property = 'Email' 
WHERE t1.Property = 'Name' 

Ergebnis Set 2

1

Selbst verbinden mit derselben Tabelle Eigenschaft über variable

geben
DECLARE @prop nvarchar(max) = 'Email' 

SELECT DISTINCT c.CustId, @prop as Property, c1.PropertyValue 
FROM yourtable c 
LEFT JOIN yourtable c1 
    ON c.CustId = c1.CustId and c1.Property = @prop 

Ausgang sein wird, wie Sie in Ihrer Frage gestellt.

1
SELECT CustId 
    , MIN(CASE WHEN Property IS NULL THEN 'Email' ELSE Property END) Property 
    , MIN(PropertyValue) PropertyValue 
FROM TableName 
GROUP BY CustId 
HAVING Property = 'Email'; 
+1

Was fügt dies dem anderen hinzu Antworten? – OrangeDog

+0

Entschuldigung für die Verzögerung. Diese Abfrage filtert die Zeile mit dem Eigenschaftswert "E-Mail" und gruppiert die Kundennummer. Wenn also ein custid keine 'Email' als Eigenschaftswert hat, wird er als null zurückgegeben. – PriVictor

Verwandte Themen