我正在尝试根据某些条件以某种方式对某些列进行分组。我在这种情况下的标准是:如果Category_Name是“性能”,我希望“销售”和“成本”进入“分组”列,其值将进入“金额”列。如果Category_Name是“质量”,我希望“Rev”进入分组列,其值进入Amount列。请注意,我使用Netezza作为我的数据库。这是我现在拥有的: 当前表或当前问题:
期望的结果:
P.S。我正在使用NETEZZA
答案 0 :(得分:2)
下面的示例和解决方案是在SQL Server 2012中使用ANSI SQL完成的。如果它符合ANSI标准,这在NETEZZA中应该可以正常工作。
首先,在TEMPDB中创建一个样本表并加载数据。这是SQL Server特定的。可以是您创建的任何测试数据库。
-- 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中结果窗口的屏幕截图。
这可以解决您的问题。
此致 约翰 - 狡猾的DBA