2016-05-20 2 views
0

У меня есть таблица со следующей информацией: клиент, строка, текст. Значения строки равны 1-5, что соответствует дням недели, пн-пт. Мы можем увидеть данные, такие как:Microsoft SQL можно связать результат двух операторов select

|Customer | Line | Text | 
|123  | 1 | 018 | 
|123  | 3 | 030 | 
|234  | 2 | 129 | 

Клиент 123 замечен в понедельник и среду, а клиент 234 виден во вторник.

Я хочу, чтобы генерировать одну строку для каждого клиента, который выглядит как:

123 Mon  Wed 
234  Tue 

я могу использовать

select Customer, DaysOfWeek = 
case text 
    when '' then ' ' 
    else 'Tue '   
end 
from routing where customer = %s and line = '2' 

, который будет генерировать "Вт", когда% S = '234'.

Когда я складываю пять из них, каждый из которых имеет номер строки от 1 до 5, разделенный UNION, я получаю две отдельные строки для Mon и Wed для клиента 123. Я не могу заставить его поставить результаты всех выберите утверждения в одной строке. Я пробовал CONCAT, &, + .... Я застрял.

+1

Какой SQL вы используете? – UnhandledExcepSean

+1

«Microsoft SQL», поскольку вы используете его, означает Microsoft ** SQL Server **? Или вы ссылаетесь на Microsoft ** Access ** SQL ?? Пожалуйста, добавьте тег 'sql-server' или' ms-access', чтобы уточнить - спасибо! –

+0

Только быстрая мысль, прежде чем я отправился в бейсбольную игру моего сына ... вы могли бы написать пять запросов, каждый из которых представлял бы день. Запросы будут использовать предложение where. Затем вы объедините все пять запросов вместе, чтобы сделать свой окончательный результат. Я напишу эти вопросы как ответ, как только вернусь домой. –

ответ

0

Есть два подхода: первых дел и существует функция, например: выберите

case when exists (SELECT 1 FROM routing r1 WHERE r1.customer=r2.customer AND r1.Line=1) then 'Mon' else ' ' end || 
case when exists (SELECT 1 FROM routing r1 WHERE r1.customer=r2.customer AND r1.Line=2) then 'Tue' else ' ' end 
[... next days...] 
from routing r2 group by r2.customer 

Второй подход это является более сложным и использует шарнирные выбирает, но это не поддерживается всеми дб двигателей.

+0

Это также работает как в MSSQL, так и в UltraLite, но не работает в нашем приложении.И прежде чем вы спросите, я понятия не имею, что разработчики используют для SQL в приложении. Я просто делаю настройку. Спасибо за помощь. – TychaBrahe

+0

Попробуйте мой SQL-запрос, я уверен, он будет работать для вас, хотя это не самый эффективный способ сделать это. –

2

Если бы я получил это право,

select Customer, 
    Day1 = max(case line when '1' then 'Mon ' end), 
    Day2 = max(case line when '2' then 'Tue ' end), 
    --..  
from routing 
where customer = %s 
    and Len(text) > 0 -- skip empty text rows 
group by Customer 

Этот запрос возвращает одну строку и столбцы, на каждый день недели необходимо.

+0

Мне это нравится. Он работал в MS SQL Server, и он работал в Ultralite, когда я сменил Len() на Length(). Я просто не могу заставить его работать в нашем приложении. Эксперименты продолжаются. – TychaBrahe

+0

@Serg Я никогда не думал о написании оператора SQL, как предложение select в этом запросе. Кажется, это псевдоним, но на фронте. Я сделал это с переменной, но мне никогда не приходило в голову попробовать это в обычном запросе. Я думаю, мне действительно понравится. :) Я не проверял это, поэтому, пожалуйста, поправьте меня, если я ошибаюсь, думая, что он используется именно так. –

+0

@Michael это действительно псевдоним, но этот стиль поддерживается несколькими СУБД, включая MS SQL. – Serg

0

Это должно работать в вашем приложении:

Если он не работает, как КТР (Common Таблица Expression) в вашем приложении, то я буду переводить на вложенные запросы, которые должны работать точно.

WITH CUSTOMERS AS 
    (SELECT DISTINCT Customer 
    FROM routing), 
    DAY1 AS 
(SELECT Customer, 
     Line 
    FROM routing 
    WHERE Line = 1 
    AND isnull(Text, '') <> ''), 
    DAY2 AS 
(SELECT Customer, 
     Line 
    FROM routing 
    WHERE Line = 2 
    AND isnull(Text, '') <> ''), 
    DAY3 AS 
(SELECT Customer, 
     Line 
    FROM routing 
    WHERE Line = 3 
    AND isnull(Text, '') <> ''), 
    DAY4 AS 
(SELECT Customer, 
     Line 
    FROM routing 
    WHERE Line = 4 
    AND isnull(Text, '') <> ''), 
    DAY5 AS 
(SELECT Customer, 
     Line 
    FROM routing 
    WHERE Line = 5 
    AND isnull(Text, '') <> '') 
SELECT CUSTOMERS.Customer, 
    CASE WHEN DAY1.Line IS NULL THEN '' ELSE 'Mon' END AS 'Mon', 
    CASE WHEN DAY2.Line IS NULL THEN '' ELSE 'Tue' END AS 'Tue', 
    CASE WHEN DAY3.Line IS NULL THEN '' ELSE 'Wed' END AS 'Wed', 
    CASE WHEN DAY4.Line IS NULL THEN '' ELSE 'Thu' END AS 'Thu', 
    CASE WHEN DAY5.Line IS NULL THEN '' ELSE 'Fri' END AS 'Fri' 
    FROM CUSTOMERS 
    LEFT JOIN DAY1 
    ON CUSTOMERS.Customer = DAY1.Customer 
    LEFT JOIN DAY2 
    ON CUSTOMERS.Customer = DAY2.Customer 
    LEFT JOIN DAY3 
    ON CUSTOMERS.Customer = DAY3.Customer 
    LEFT JOIN DAY4 
    ON CUSTOMERS.Customer = DAY4.Customer 
    LEFT JOIN DAY5 
    ON CUSTOMERS.Customer = DAY5.Customer 

Хорошо, я пошел вперед и создал версию вложенного запроса. Я очень уверен, что это будет работать в вашем приложении.

SELECT DISTINCT C.Customer, 
    CASE WHEN DAY1.Line IS NULL THEN '' ELSE 'Mon' END AS 'Mon', 
    CASE WHEN DAY2.Line IS NULL THEN '' ELSE 'Tue' END AS 'Tue', 
    CASE WHEN DAY3.Line IS NULL THEN '' ELSE 'Wed' END AS 'Wed', 
    CASE WHEN DAY4.Line IS NULL THEN '' ELSE 'Thu' END AS 'Thu', 
    CASE WHEN DAY5.Line IS NULL THEN '' ELSE 'Fri' END AS 'Fri' 
    FROM routing C 
    LEFT JOIN (SELECT Customer, 
     Line 
    FROM routing 
    WHERE Line = 1 
    AND isnull(Text, '') <> '') DAY1 
    ON C.Customer = DAY1.Customer 
    LEFT JOIN (SELECT Customer, 
     Line 
    FROM routing 
    WHERE Line = 2 
    AND isnull(Text, '') <> '') DAY2 
    ON C.Customer = DAY2.Customer 
    LEFT JOIN (SELECT Customer, 
     Line 
    FROM routing 
    WHERE Line = 3 
    AND isnull(Text, '') <> '') DAY3 
    ON C.Customer = DAY3.Customer 
    LEFT JOIN (SELECT Customer, 
     Line 
    FROM routing 
    WHERE Line = 4 
    AND isnull(Text, '') <> '') DAY4 
    ON C.Customer = DAY4.Customer 
    LEFT JOIN (SELECT Customer, 
     Line 
    FROM routing 
    WHERE Line = 5 
    AND isnull(Text, '') <> '') DAY5 
    ON C.Customer = DAY5.Customer 
+0

Единственное, что я могу думать о том, что это несовместимо с вашим приложением, это функция isnull(). Вы можете попытаться изменить это, если он терпит неудачу. –