在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语句根据某些条件对列进行分组的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句 group by子句后的分组项如果有多个是怎样进行分组的

查询分组中的 Oracle SQL 条件聚合函数

case when用法sql

根据不同的条件对两个不同的列进行分组和求和

Laravel 选择列,然后按日期对列值进行分组

Mysql 查询 - 在 case 语句中使用 Locate 函数按源对流量进行分组