2013-12-08 5 views
1

Я пытаюсь группировать некоторые столбцы определенным образом на основе некоторых критериев. Мои критерии в этой ситуации: если Category_Name - «Производительность», я хочу, чтобы «Продажи» и «Стоимость» отправлялись в столбце «Группирование», а их значения - в столбце «Сумма». Если Category_Name «Quality», я хочу, чтобы «Rev» перешел в столбец Grouping и его значение, чтобы перейти в столбец «Сумма». Обратите внимание, что я использую Netezza в качестве моей базы данных. Вот что я есть сейчас: ТОК ТАБЛИЦА ИЛИ ТЕКУЩИЙ НОМЕР:Группировка столбцов на основе некоторого условия с использованием case case в sql

enter image description here

ЖЕЛАЕМЫЕ РЕЗУЛЬТАТЫ:

enter image description here

P.S. Я использую NETEZZA

+0

жаль, что я не уверен, как использовать ASCII таблицу, я вижу только там, где я могу добавить изображение или код, но не в качестве таблицы ASCII. благодаря – moe

ответ

2

Пример и решение, приведенное ниже, были выполнены с использованием ANSI SQL в SQL Server 2012. Это должно отлично работать в NETEZZA, если оно совместимо с ANSI.

Сначала создайте образец таблицы в TEMPDB и загрузите данные. Это специфический SQL-сервер. Может быть любая база данных тестирования, которую вы создаете.

-- Use temp db 
USE TEMPDB; 
GO 

-- Create a temp table 
CREATE TABLE T1 
(
    LOCATION_CODE CHAR(2), 
    PART_NUM CHAR(2), 
    CATEGORY_NAME VARCHAR(25), 
    YEAR_NUM INT, 
    SALES_NUM INT, 
    COST_NUM INT, 
    REV_NUM INT 
); 

-- Add 3 row of data 
INSERT INTO T1 
VALUES ('NY', '1A', 'Performance', 2001, 100, 35, 45); 

INSERT INTO T1 
VALUES ('IL', '2E', 'Quality', 2002, 250, 150, 44); 

INSERT INTO T1 
VALUES ('IL', '4F', 'Performance', 2003, 355, 280, 33); 
GO 

-- Show the data 
SELECT * FROM T1; 
GO 

В общем, что вы хотите сделать, это реорганизовать данные. Создайте две разные строки для данных Performance и одну строку для данных Quality. Затем закажите все строки по местоположению и номеру детали.

UNION ALL - это то, что вы хотите. Этот оператор не удаляет дубликаты между наборами результатов. Три запроса по одному для каждого случая, UNION ALL между ними и ORDER BY в конце будут давать результаты, которые вы ищете.

http://technet.microsoft.com/en-us/library/ms180026.aspx

Вот пример кода.

-- Break Performance into 2 rows - A 
SELECT 
    LOCATION_CODE, 
    PART_NUM, 
    CATEGORY_NAME, 
    'Sales' as GROUPED, 
    SALES_NUM as AMOUNT 
FROM T1 
WHERE CATEGORY_NAME = 'Performance' 
UNION ALL 
-- Break Performance into 2 rows - B 
SELECT 
    LOCATION_CODE, 
    PART_NUM, 
    CATEGORY_NAME, 
    'Cost' as GROUPED, 
    COST_NUM as AMOUNT 
FROM T1 
WHERE CATEGORY_NAME = 'Performance' 
UNION ALL 
-- One row for Quality 
SELECT 
    LOCATION_CODE, 
    PART_NUM, 
    CATEGORY_NAME, 
    'Rev' as GROUPED, 
    REV_NUM as AMOUNT 
FROM T1 
WHERE CATEGORY_NAME = 'Quality' 

-- Order the results 
ORDER BY LOCATION_CODE, PART_NUM; 

Вот скриншот окна результатов в SSMS.

enter image description here

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

С уважением, Джон - Хитрый DBA

Смежные вопросы