2015-06-29 2 views
1

Я пытался собрать SQL-запрос, который показывает одну строку для каждой записи со значениями из другого поля, разбитого на их собственные столбцы. Как я могу показать несколько столбцов и одну строку для каждой записи?SQL Select - Как показать несколько столбцов на основе значения поля?

У меня есть таблица с данными, похожими на следующем примере:

+--------------+------------+---------------+ 
| Employee_Num | Client_Num | Deduction_Num | 
+--------------+------------+---------------+ 
|   1305 |  1000 |    1 | 
|   1305 |  1000 |   30 | 
|   1312 |  1000 |    1 | 
|   1320 |  1000 |    1 | 
|   1320 |  1000 |   30 | 
|   1323 |  1000 |   30 | 
|   1323 |  1000 |    1 | 
+--------------+------------+---------------+ 

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

SELECT Employee_Num, Client_Num, Deduction_1, Deduction_30 
FROM (SELECT 
    Employee_Num, 
    Client_Num, 
    Deduction_Num AS Deduction_1, 
    Deduction_Num AS Deduction_30 
    FROM Employee_Deductions 
    WHERE client_num = 1000 
    AND Deduction_Num IN (1) 
UNION 

    SELECT 
    Employee_Num, 
    Client_Num, 
    Deduction_Num AS Deduction_1, 
    Deduction_Num AS Deduction_30 
    FROM Employee_Deductions 
    WHERE Client_Num, = 1000 
    AND Deduction_Num IN (30) 
) AS Datum 

WHERE Client_Num = 1000 
ORDER BY Employee_Num 

Я хотел бы, чтобы это было желаемого результата:

+--------------+------------+-------------+--------------+ 
| Employee_Num | Client_Num | Deduction_1 | Deduction_30 | 
+--------------+------------+-------------+--------------+ 
|   1305 |  1000 |   1 |   30 | 
|   1312 |  1000 |   1 |    | 
|   1320 |  1000 |   1 |   30 | 
|   1323 |  1000 |   1 |   30 | 
+--------------+------------+-------------+--------------+ 

Любая помощь будет оценена.

+0

ли несколько записей, котор вы получаете одинаковые, или есть разные данные для различных областей? – Gene

ответ

1

буквально получить то, что вы просили сазе будет работать:

select Employee_Num 
    , Client_Num 
    , max(case when deduction_num = 1 then deduction_num end) as Deduction_1 
    , max(case when deduction_num = 30 then deduction_num end) as Deduction_30 
From Employee_Deductions 
Group by Employee_Num 
    , Client_Num 

Однако это звучит как то, что вы хотите сделать, это повернуть данные в соответствии с настоящим Technet article. Надеюсь, это поможет.

0

Вы можете попробовать:

SELECT DISTINCT Employee_Num, 
Client_Num, 
CASE WHEN Deduction_Num = 1 
    THEN 1 
    ELSE '' 
    END Deduction_1, 
CASE WHEN Deduction_Num = 30 
    THEN 30 
    ELSE '' 
    END Deduction_30 
FROM Employee_Deductions 
WHERE Client_Num = 1000 
AND Deduction_Num IN (1,30) 
0

Я хотел бы предложить, чтобы группировать по ResultSet комбинации Employee_Num и Client_num вычислительное синтетические агрегатные столбцы, как вы нуждаетесь в них. Из этого промежуточного результирующего набора вы можете получить таблицу с желаемой структурой вывода, заполняя столбцы, соответствующим образом комбинируя вычисленные агрегаты.

Пример:

SELECT agg.Employee_Num 
    , agg.Client_Num 
    , agg.dmin            Deduction_1 
    , CASE agg.dmax WHEN 30 THEN agg.dmax else NULL END Deduction_30 
    FROM (
      SELECT Employee_Num 
       , Client_Num 
       , MIN (Deduction_Num) dmin 
       , MAX (Deduction_Num) dmax 
       FROM Employee_Deductions 
      GROUP BY Employee_Num 
       , Client_num 
     ) agg 
    ; 
Смежные вопросы