我有一张几百列宽的桌子。有没有办法将每一行转换为包含列标题的单个串联字符串,而不必列出查询中的每一列?
我这样做是因为列代表事件报告中的字段。我将它们重新组合在一起,以便人们可以以合乎逻辑的方式阅读报告。
我已经通过查询完成了其中的一些工作,但是为每一列都做起来很费力,而且似乎容易出错。
这是一个简短的片段,显示以我需要的格式连接的三列,在逐列方法中完成:
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)
谢谢
我有如下数据:
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 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)
我想达到这个结果: …
请告诉我如何修改此 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) 我有一个支点,其中我与坦克编号签订了合同,以 ; 分隔。我已经得到了这个例子来将它们向下旋转成行(有效):
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) 我了解 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 有任何影响。
有任何想法吗?
我有几个表需要转换成一个新表。我肯定 (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
如何在一个查询中为多个表执行此操作?
我自己有一个相当复杂的问题,我希望有人可以帮助我。
我想使用 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 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) 我有一个具有以下结构的数据库:
| 日期 | 角色 | 类型 | 期间 |
|---|---|---|---|
| 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。
pivot ×10
postgresql ×5
sql-server ×3
aggregate ×2
amazon-rds ×1
aws ×1
group-by ×1
oracle ×1
oracle-10g ×1
syntax ×1