在sql中使用case语句根据某些条件对列进行分组
Posted
技术标签:
【中文标题】在sql中使用case语句根据某些条件对列进行分组【英文标题】:Grouping Columns based on some condition using case statement in sql 【发布时间】:2013-12-08 02:24:22 【问题描述】:我正在尝试根据某些标准以某种方式对某些列进行分组。我在这种情况下的标准是:如果 Category_Name 是“Performance”,我希望“Sales”和“Cost”进入 Grouping 列,它们的值进入 Amount 列。如果 Category_Name 是“Quality”,我希望“Rev”进入 Grouping 列,其值进入 Amount 列。请注意,我使用 Netezza 作为我的数据库。这是我现在拥有的: 当前表或当前问题:
期望的结果:
附言我正在使用 NETEZZA
【问题讨论】:
对不起,我不知道如何使用 ASCII 表,我只看到可以添加为图像或代码的位置,而不是 ASCII 表。谢谢 【参考方案1】:下面的示例和解决方案是使用 SQL Server 2012 中的 ANSI SQL 完成的。如果 NETEZZA 符合 ANSI,这应该可以正常工作。
首先,在 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
基本上,您要做的是重新组织数据。为性能数据制作两行不同的行,为质量数据制作一行。然后按位置和零件号对所有行进行排序。
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
【讨论】:
以上是关于在sql中使用case语句根据某些条件对列进行分组的主要内容,如果未能解决你的问题,请参考以下文章