当前位置: 首页 > 知识库问答 >
问题:

SQL将行移动为列-PIVOT查询[重复]

阎修明
2023-03-14

鉴于:

+-----------+---------------+-------------+-------+
|   Name    |   Location    | Description | Value |
+-----------+---------------+-------------+-------+
| Company A | Houston       | Sales       |   100 |
| Company A | Houston       | Profit      |    50 |
| Company B | San Francisco | Sales       |   500 |
| Company B | San Francisco | Profit      |   200 |
| Company C | New York      | Sales       |   200 |
| Company C | San Francisco | Profit      |   150 |
+-----------+---------------+-------------+-------+

如何使用SQL将其转换为:

+----------+---------------+--------+---------+
|   Name   |   Location    | Sales  | Profit  |
+----------+---------------+--------+---------+
| CompanyA | Houston       |    100 |      50 |
| CompanyB | San Francisco |    500 |     200 |
| CompanyC | New York      |    200 |     150 |
+----------+---------------+--------+---------+

共有3个答案

松桐
2023-03-14

要将数据转换为所需的形式,您可以执行以下操作:

 SELECT NAME
          ,LOCATION
          ,SUM (CASE WHEN DESCRIPTION = 'Sales' THEN Values ELSE 0 END) AS SALES
          ,SUM (CASE WHEN DESCRIPTION = 'Profit' THEN Values ELSE 0 END) AS PROFIT
 FROM yourtable
 GROUP BY NAME
               ,LOCATION
宗政元青
2023-03-14

假设您的描述值仅为销售和利润,这里有一个CTE解决方案。我在前面调用了初始表。

with cteSales as (select name, value from Before where description = 'Sales')
, cteProfit as (select name, value from Before where description  = 'Profit')
select 
distinct 
    name
    , location
    , (select value from cteSales where name = B.name) as Sales
    , (select value from cteProfit where name = B.name) as Profit
from Before B
夏侯楷
2023-03-14

尝试1或2查询:http://sqlfiddle.com/#!6/bb33b/7
第二个给出了您的问题中显示的确切结果,但我猜第一个是您正在寻找的。

SELECT Name, Location,
       Sum( Case Description when 'Sales' Then Value else 0 end ) Sales,
       Sum( Case Description when 'Profit' Then Value else 0 end ) Profit
FROM table1
GROUP BY Name, Location
Order by 1,2
;

|      Name |      Location | Sales | Profit |
|-----------|---------------|-------|--------|
| Company A |       Houston |   100 |     50 |
| Company B | San Francisco |   500 |    200 |
| Company C |      New York |   200 |      0 |
| Company C | San Francisco |     0 |    150 |
SELECT Name, Min( Location ) As Location,
       Sum( Case Description when 'Sales' Then Value else 0 end ) Sales,
       Sum( Case Description when 'Profit' Then Value else 0 end ) Profit
FROM table1
GROUP BY Name
Order by 1,2
;
;

|      Name |      Location | Sales | Profit |
|-----------|---------------|-------|--------|
| Company A |       Houston |   100 |     50 |
| Company B | San Francisco |   500 |    200 |
| Company C |      New York |   200 |    150 |
 类似资料:
  • 问题内容: 我已经徒劳地搜索了很长时间,不得不承认失败并寻求帮助,我正在尝试修改数据透视查询,以从具有以下数据的表中生成结果的动态查询: 为了显示这样的内容,其中页码列取决于用户访问的页面数: 我已经通过对列中的硬编码进行了管理,但是显然我不想继续更改脚本以容纳越来越多的页面。 到目前为止,我有一些类似的东西: 任何帮助或正确方向的指点将不胜感激! 提前致谢! 问题答案: 我所看到的关于动态枢轴的

  • 问题内容: 需要将此查询转换为SQL Server 我已经阅读了所有其他帖子,但无法将其转换为相同的帖子 问题答案: 这是使用表运算符的等效版本: SQL小提琴演示 例如,这将为您提供: 请注意, 使用MS SQL Server表运算符时,必须输入数据透视列的值。然而,在MS Access,这是该作品是用做的,这是动态获取枢转列的值。在这种情况下,您必须与操作员一起动态地执行此操作,如下所示: 更

  • 问题内容: 我在SQL Server 2008中具有下表: 我需要创建以下输出的查询: 列可以固定为[Mitarbeiter1]-[Mitarbeiter5],因为每个Filiale的行数不能超过5行。 非常感谢您的帮助! 问题答案: 使用SQL Server 2008,将Pivot和Rank函数组合在一起,可以为每个雇员数量提供理想的结果。首先,我们为每个分支中的每个员工分配一个ID,从每个新分

  • 问题内容: 我有一个如下所示的表。我的问题是:如何将列转换为行?我正在使用Microsoft SQL Server 我需要像下面的操作 怎么做?谢谢 问题答案: 您的资料 询问 结果集

  • 我已经读过关于MS透视表的东西,但我仍然有问题得到正确的这一点。 我有一个正在创建的临时表,我们会说第1列是一个商店号,第2列是一个星期号,最后第3列是某种类型的总数。而且周数是动态的,商店数是静态的。 我希望它作为一个透视表出来,像这样: 商店的数字下侧和周横跨顶部。

  • 问题内容: 我在一个专栏中看到了很多关于PIVOT的问题,每个问题都比其他问题复杂,但是,找不到所需的东西。 老实说,在这种情况下,我什至不知道枢轴是否对我有帮助。 假设我的源表中有以下数据: 最多5行,包含名字和姓氏。第一和最后一列的值将是随机的。 我试图将这些数据转换为如下形式: 例如:如果列First5和Last5为NULL,因为只有4行,我没有任何问题。 任何人都可以给我一点帮助吗?谢谢。