标签: pivot

将行转换为包含列名的串联字符串

我有一张几百列宽的桌子。有没有办法将每一行转换为包含列标题的单个串联字符串,而不必列出查询中的每一列?

我这样做是因为列代表事件报告中的字段。我将它们重新组合在一起,以便人们可以以合乎逻辑的方式阅读报告。

我已经通过查询完成了其中的一些工作,但是为每一列都做起来很费力,而且似乎容易出错。

这是一个简短的片段,显示以我需要的格式连接的三列,在逐列方法中完成:

SELECT 
 Concat( 
   IIf(Id IS NULL, Null, Concat('Id: ' , [Id] , '\n') )  , 
   IIf(StandardClientId IS NULL, Null, 
     Concat('StandardClientId: ' , [StandardClientId] , '\n') )  , 
   IIf(ClientName IS NULL, Null, 
     Concat('ClientName: ' , [ClientName] , '\n') ) 
 )  AS ReportLine
FROM dbo.DataDecoded; 
Run Code Online (Sandbox Code Playgroud)

谢谢

sql-server pivot

6
推荐指数
3
解决办法
2480
查看次数

将行转换为列

我有如下数据:

    created_at | 地位    
---------------------+------------
 2016-04-05 1:27:15 | 信息
 2016-04-05 3:27:15 | 信息
 2016-04-05 5:27:15 | 警告
 2016-04-05 10:27:15 | 信息
 2016-04-05 11:27:15 | 警告

有了这些数据,我想转换如下:

状态 | 2016-04-05 1:00:00 | 2016-04-05 4:00:00 | 2016-04-05 8:00:00 | 2016-04-05 12:00:00
---------+--------------------+------------ -+--------------------+--------------------
 信息 | 1 | 1 | 0 | 1
 警告 | 0 | 0 | 1 | 1                  

谁能建议最好的方法来做到这一点?

postgresql pivot postgresql-9.1

6
推荐指数
2
解决办法
1万
查看次数

将多行合并为单行

在 PostgreSQL 9.5 中,我有一个名为的表reports

CREATE TABLE public.reports (
  id BIGSERIAL PRIMARY KEY,
  id_station character(11) NOT NULL,
  date date NOT NULL,
  element character(4) NOT NULL,
  value smallint NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

对于每个站(id_station列)和每一天(date列),我可能有多个值类型(元素列) : TMIN, TMAX, TAVG(有时这些值不存在:对于给定的一天,我可能只有 aTMIN和 a TMAX)。

这是一个(假)样本:

22;"FR069029001";"1925-01-01";"TMAX";130
23;"FR069029001";"1925-01-01";"TMIN";-25
24;"FR069029001";"1925-01-01";"TAVG";0
Run Code Online (Sandbox Code Playgroud)

我想使用此表将每个站点和每天的这些值合并在一行中:

CREATE TABLE public.reports_con (
id SERIAL PRIMARY KEY,
id_station character(11) NOT NULL,
date date NOT NULL,
tmin smallint,
tmax smallint,
tavg smallint
);
Run Code Online (Sandbox Code Playgroud)

我想达到这个结果: …

postgresql aggregate pivot aggregate-filter

6
推荐指数
1
解决办法
1万
查看次数

SQL Server 2005:如何使用数据透视代替一堆 case 语句?

请告诉我如何修改此 SQL 选择以使用数据透视而不是所有 case 语句。

SELECT t.ProjectId,    
   COALESCE(MAX(ExecutiveChampion), 'n/a'),    
   COALESCE(MAX(BusinessOwner), 'n/a'),    
   COALESCE(MAX(BusinessAnalyst), 'n/a'),    
   COALESCE(MAX(GeneralContractor), 'n/a'),    
   COALESCE(MAX(PrimaryPM),  'n/a'),    
   COALESCE(MAX(DevelopmentManager), 'n/a'),    
   COALESCE(MAX(DevelopmentLead), 'n/a'),    
   COALESCE(MAX(TDM), 'n/a'),    
   COALESCE(MAX(PTM), 'n/a')    
FROM (    
    SELECT pl.ProjectId,     
           CASE WHEN StakeholderCID = 95  THEN FullName ELSE NULL END as 'ExecutiveChampion',    
           CASE WHEN StakeholderCID = 96  THEN FullName ELSE NULL END as 'BusinessOwner',    
           CASE WHEN StakeholderCID = 97  THEN FullName ELSE NULL END as 'BusinessAnalyst',    
           CASE WHEN StakeholderCID = 100 THEN FullName ELSE NULL END as 'GeneralContractor',    
           CASE WHEN StakeholderCID …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 syntax pivot

5
推荐指数
2
解决办法
1630
查看次数

帮助使用 Oracle Pipelined 函数

我有一个支点,其中我与坦克编号签订了合同,以 ; 分隔。我已经得到了这个例子来将它们向下旋转成行(有效):

SELECT oks_c.contract_number, 
       oks_l.line_id,
       oks_l.tank_numbers, column_value AS TANK_NUMBER 
  FROM oks_contract_header oks_c
 INNER JOIN oks_contract_lines oks_l 
    ON oks_l.contract_number = oks_c.contract_number AND 
       oks_l.item_name LIKE '%.55201'
    , table(str2tbl(oks_l.tank_numbers,';')) acbb
ORDER BY oks_c.contract_number, 
         oks_l.line_id, 
         TANK_NUMBER
Run Code Online (Sandbox Code Playgroud)

这是流水线函数:

CREATE OR REPLACE function DBRAJAH.str2tbl( p_str in varchar2, p_delim in varchar2 default ',' ) return 
str2tblType
PIPELINED
as
    l_str      long default p_str || p_delim;
    l_n        number;
begin
    loop
        l_n := instr( l_str, p_delim );
        exit when (nvl(l_n,0) = 0);
        pipe row( ltrim(rtrim(substr(l_str,1,l_n-1))) );
        l_str := substr( …
Run Code Online (Sandbox Code Playgroud)

oracle oracle-10g pivot

5
推荐指数
1
解决办法
520
查看次数

需要有关 SQL Server PIVOT 的帮助

我了解 SQL Server 中的 PIVOT 功能,并且在这里阅读了一些其他问题和答案,但我似乎无法掌握它来完成我需要的操作。我正在尝试进行一些计算,结果如下:

TABLE office_settings
column office_id (bigint not null)
column setting_value (NVARCHAR(500) NOT NULL)

office_id    setting_value
--------------------------------------------
4             0.2
4             0.2
4             2
4             3
5             0.2
5             0.2
5             2
5             3
Run Code Online (Sandbox Code Playgroud)

我想使用 PIVOT (假设这是适合该工作的工具)将其转换为这个,基本上是“按”office_id 列“分组”,所以:

office_id    value_1    value_2    value_3   value_4
------------------------------------------------------
    4         0.2         0.2         2         3
    5         0.2         0.2         2         3
Run Code Online (Sandbox Code Playgroud)

我还应该提到,在此过程中我需要将setting_value 列值转换为DECIMAL(4,2) - 以防这对完成它所需的T-SQL 有任何影响。

有任何想法吗?

sql-server pivot

5
推荐指数
1
解决办法
2125
查看次数

多表枢轴

我有几个表需要转换成一个新表。我肯定 (un)pivot 是解决问题的方法。但是,我不确定使用单个查询将多个表中的数据反透视为单个表的最佳方法是什么。

这些表大致如下所示:

销售:Pk、Year、Week1、Week2、Week3、...Week52

数量:Pk、Year、Week1、Week2、Week3、...Week52

订单:Pk、Year、Week1、Week2、Week3、...Week52

... 等等

我想要的是格式的表格

汇总表:Pk、Year_Week、销售额、数量、订单

我已经从上一个问题(使用 PIVOT 将单年列和多周列转换为单年/周列)中学到了如何为单个表执行此操作。大致如下所示:

SELECT Pk, Sales FROM (SELECT Pk, Wk1, Wk2, ..., Wk52 FROM Sales_Table) source UNPIVOT ( FOR Sales IN Wk1, Wk2, ..., Wk52 ) upt

如何在一个查询中为多个表执行此操作?

sql-server pivot

5
推荐指数
1
解决办法
1850
查看次数

在 PostgreSQL 9.0 中创建 crosstab() 数据透视表

我自己有一个相当复杂的问题,我希望有人可以帮助我。

我想使用 PostgreSQL 来从无几何表创建数据透视表。

为了简单起见,我将只显示我想要用于枢轴的表结构,然后使用给出的方法来创建其他表结构,我希望:)

我想使用的字段是postcode_nospace_, 和ageband

ageband顶部的列是行,postcode_nospace_每个邮政编码的计数是数据。

有 2132 条记录,其中一些记录有多个邮政编码,因此计数。

CREATE TABLE adult_social_care.activities_in_localities_asc
(
  ogc_fid integer NOT NULL,
  sort numeric(5,0),
  ageband character(12),
  postcode_nospace_ character(8),
  wkb_geometry geometry,
  CONSTRAINT activities_in_localities_asc_pkey PRIMARY KEY (ogc_fid)
);
Run Code Online (Sandbox Code Playgroud)

更新:

这是我想要实现的结果,如具有相同数据的 Excel 数据透视表所示。

postcode 18_24  25_34   35_44   45_54   55_64   65_74   Total Count
----------------------------------------------------------------------------
BB115DE     1           2                   2      3       8
FY38LZ                              1       1              2
Run Code Online (Sandbox Code Playgroud)

通过环顾四周,我编译了以下 SQL 查询。它按邮政编码分组并创建所需的字段名称。但是这些字段是空白的。理想情况下,我还希望total_count在表格末尾有一列。

SELECT * FROM crosstab(
    'SELECT postcode_nospace_, ageband, count(ageband) as total_count
     FROM …
Run Code Online (Sandbox Code Playgroud)

postgresql pivot postgresql-9.0

5
推荐指数
1
解决办法
4335
查看次数

RDS 交叉表:错误:语言 c 的权限被拒绝

我们目前在生产数据库中使用 PostgreSQL 9.2,我们希望迁移到使用 PostgreSQL 9.4 的新 RDS 实例。但是,我们需要拥有创建函数的权限,但只有超级用户才能在 RDS 上创建函数,而我的用户无法被授予超级用户权限。

CREATE FUNCTION crosstab50(text, OUT rownumber integer, OUT c1 text,...) 
    RETURNS SETOF record 
    LANGUAGE c 
    STABLE STRICT 
    AS '$libdir/tablefunc', 'crosstab';
Run Code Online (Sandbox Code Playgroud)

但我们在恢复操作期间遇到此错误:

ERROR:  permission denied for language c
Run Code Online (Sandbox Code Playgroud)

postgresql pivot aws postgresql-9.4 amazon-rds

5
推荐指数
1
解决办法
6450
查看次数

如何将一列中的值转置到具有不同列中的值的列中?

我有一个具有以下结构的数据库:

日期 角色 类型 期间
2022-04-16 护士 准备食材 45
2022-04-17 护士 打扫 30
2022-04-17 志愿者 打扫 20
2022-04-17 护士 准备食材 60

注意:我事先不知道“类型”列中的值,因为它们是由用户定义的。此外,可以有多行具有重叠的日期、角色和类型。

我正在使用一个图表库,希望将数据分组如下:

角色 准备食材 打扫
护士 105 30
志愿者 无效的 20

到目前为止,我可以使用以下查询对数据进行分组

select 
    role,
    type, 
    sum(duration) as total_minutes
from work
group by role, type;
Run Code Online (Sandbox Code Playgroud)
角色 类型 总分钟数
护士 打扫 45
护士 准备食材 20
志愿者 打扫 15
志愿者 准备食材 43

如何“旋转”/“转置”数据,以便每一行代表一个角色,其中一列包含每种类型工作的分钟总和?

实际上,我想转置类似于 Pandas DataFrame.pivot_table函数的数据,但仅使用 SQL。

postgresql aggregate pivot group-by

5
推荐指数
1
解决办法
2万
查看次数