2016-05-31 6 views
3

У меня есть одна таблица, содержащая клиентов (Цель этой таблицы заключалась в том, чтобы добавлять поля без DB-Update). Таблица выглядит следующим образом:Как написать запрос?

CustId  Property  PropertyValue 

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

(клиент 3 не имеет вход для «Электронная почта» в таблице)

Ожидаемый результат: Я хочу, чтобы получить одну строку на клиенте (Mail), и если у клиента нет электронной почты, пока еще одна строка с NULL.

CustId  Property  PropertyValue 

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

У кого-то есть решение?

+4

Можете ли вы поделиться SQL вы пробовали до сих пор? –

ответ

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

Ммм, это не то, что он просил – sagi

+0

@sagi да, небольшая ошибка с моей стороны :) уже обновлено – Devart

+0

Лучшее решение, тогда все мы, хотя :) – sagi

3

Вы можете сделать это с помощью производной таблицы, содержащей все возможные ID «с, а затем оставил присоединиться только к электронной почте на исходную таблице:

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') 

также может быть сделан с корреляцией запросом:

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

Ваш первый запрос приводит к следующей ошибке: 'Недопустимое имя столбца 'property'.' Ваш второй запрос работает по назначению. – HappyCoding

+1

@HappyCoding спасибо, опечатка. Смешанные '' 'с' t' – sagi

5

Запрос 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' 

Результат Набор 1

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

Запрос 2

Другой запрос для более читаемым результирующего набора должен выглядеть примерно так ....

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' 

Результат Набор 2

╔════════╦══════════════╦═══════════════════╗ 
║ CustId ║ CustomerName ║ CustomerEmail ║ 
╠════════╬══════════════╬═══════════════════╣ 
║  1 ║ Smith  ║ [email protected] ║ 
║  2 ║ Donalds  ║ [email protected] ║ 
║  3 ║ john   ║ NULL    ║ 
╚════════╩══════════════╩═══════════════════╝ 
1

автообъединение с той же таблице, собственность передается через переменную

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 

выход будет, как вы вывесили в вашем вопросе.

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

Что это добавляет к другому ответы? – OrangeDog

+0

Извините за задержку. Этот запрос фильтрует строку, которая имеет значение свойства «Электронная почта», а также группирует идентификатор cust. Поэтому, если какой-либо custid не имеет «Email» в качестве значения свойства, он возвращает значение null. – PriVictor