使用sql中的case语句基于某些条件对列进行分组

时间:2013-12-08 02:24:23

标签: sql sql-server tsql netezza

我正在尝试根据某些条件以某种方式对某些列进行分组。我在这种情况下的标准是:如果Category_Name是“性能”,我希望“销售”和“成本”进入“分组”列,其值将进入“金额”列。如果Category_Name是“质量”,我希望“Rev”进入分组列,其值进入Amount列。请注意,我使用Netezza作为我的数据库。这是我现在拥有的: 当前表或当前问题:

enter image description here

期望的结果:

enter image description here

P.S。我正在使用NETEZZA

1 个答案:

答案 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中结果窗口的屏幕截图。

enter image description here

这可以解决您的问题。

此致 约翰 - 狡猾的DBA