标签: pivot

SQL 对多行/列进行反透视,但将行分组在一起,并以相同的顺序选择它们

这是一个复杂的解释,很抱歉,这将是一堵文字墙。我正在处理预先存在的代码并试图找出解决方案,所以我无法改变其中任何一个工作的核心方式。

本质上,我在一个项目中有一系列表单,所有这些表单都有一个分配给它们的状态。状态具有指定的优先顺序,这将逐渐向上级访问。当前的工作方式使用以下 sql 语句:

select state_code
 from (select ' || v_priorstr || ' 
    from m_object mo, m_form mf
      where mo.id = mf.id
        and mf.formlayout_id = :1
        and mo.v = :2)
 unpivot
   (
    state_counts
    for state_code in (' || v_priorstr || ')
   ) where state_counts = 1 and rownum = 1
Run Code Online (Sandbox Code Playgroud)

其中 v_priorstr 是逗号分隔的状态字符串,按优先顺序排列。例如,考虑以下字符串:“Blank,Error,InProgress,Completed”。m_object 表包含这些列中的每一列,用 0 或 1 显示适用的状态。(表单可以有多个状态)此查询选择最高优先级的状态,然后将用于显示该表单的状态图标。

处理重复表单时会出现问题(在一个链接下可以有多次迭代)。它们都在导航系统中共享一个状态图标。

虽然通常这很好用,因为 SQL 会自然地按照您请求的顺序显示列,并且它们在未旋转时保持该顺序。但是,对于多个表单,因此也有多个行,第一个表单/行的所有状态都绝对优先于所有表单的状态。

例如,如果我有两个这样的重复形式,第一个是“已完成”,第二个是“错误”,上面的查询(没有 rownum = 1)将返回以下两行:

Completed
Error
Run Code Online (Sandbox Code Playgroud)

到目前为止,我尝试了以下解决方案:

没有 Order By 的 Group By 将取消订单。我不能使用基于案例的 Order By,因为状态名称可能会改变。

简而言之,我需要它按照通过该字符串传入的顺序对状态名称进行排序或分组。

oracle pivot

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

我需要创建一个数据透视表还是可以更改此查询

我编写的以下查询在一定程度上起作用。我发现的问题是,在每个泵中,电缆等都可以在每个零件列中列出。例子:

在此处输入图片说明

我想得到的是列有每个泵、电缆等的井,而不是我目前得到的只是第一个泵、电缆等。

这是我正在运行的查询:

        With CTE AS(
SELECT Pull_Date, Well_Name, Part1 Part, Part1_PN PartPN, Part1_SN PartSN FROM testtest
UNION ALL
    SELECT Pull_Date, Well_Name, Part2, Part2_PN, Part2_SN from testtest
UNION ALL
    SELECT Pull_Date, Well_Name, Part3, Part3_PN, Part3_SN from testtest
)

Select Pull_Date, Well_Name,
    MIN(CASE WHEN Part='BODH' THEN 'BODH' ELSE NULL END) [BODH],
    MIN(CASE WHEN Part='BODH' THEN PartPN Else NULL END) BODH_PN,
    MIN(CASE WHEN Part='BODH' THEN PartSN ELSE NULL END) BODH_SN,
    MIN(CASE WHEN Part='Cable' THEN 'Cable' ELSE NULL END) [Cable],
    MIN(CASE WHEN Part= …
Run Code Online (Sandbox Code Playgroud)

optimization pivot t-sql

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

如何在 PostgreSQL 中旋转

表中有以下数据:

ID     Category   Value
1234   Cat01      V001
1234   Cat02      V002
1234   Cat03      V003
1234   Cat03      V004
1234   Cat03      V005
Run Code Online (Sandbox Code Playgroud)

我想要以下输出:

ID     Cat01  Cat02   Cat03
1234   V001   V002    V003
1234   V001   V002    V004
1234   V001   V002    V005
Run Code Online (Sandbox Code Playgroud)

我想要实现的输出是一种数据透视表,其中我将所有值垂直放置在一个表中,并且我希望将这些值水平放置,并将类别作为列。但是有些类别具有多个值,在这种情况下,我需要重复所有其他类别的值并为每个重复值创建一行

如何在 PostgreSQL 中完成?

postgresql pivot

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

是否可以创建动态连接?

如果重要的话,我正在使用 PostgreSQL。

假设这两个表:

 id | run
----+-------
  1 | run_1
  2 | run_2
  3 | run_3
Run Code Online (Sandbox Code Playgroud)

sample | elapsed |  run
-------+---------+-------
 samp1 | 1:09    | run_1
 samp2 | 0:32    | run_1
 samp1 | 0:58    | run_2
 samp2 | 0:28    | run_2
 samp1 | 0:55    | run_3
 samp2 | 0:28    | run_3
Run Code Online (Sandbox Code Playgroud)

我想要以下输出:

sample | run_1 | run_2 | run_3
-------+-------+-------+-------
 samp1 | 1:09  | 0:58  | 0:55
 samp2 | 0:32  | 0:28  | 0:28
Run Code Online (Sandbox Code Playgroud)

如果我有固定数量的运行值,这很容易做到,但是是否可以创建一个动态查询,无论运行次数如何,它都会输出正确的内容?

postgresql pivot

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

将多个联合语句分组

我已经查看了整个网站,但找不到解决我的问题的方法。我试图尽可能地抽象它。

我的查询是这样的:

select sup, a, b, c, d
from
(
    select sup, a, 0, 0, 0 from x where y = 1 group by sup
    union
    select sup, 0, b, 0, 0 from x where y = 2 group by sup
    union
    select sup, a, 0, c, 0 from x where y = 3 group by sup
    union
    select sup, a, 0, 0, d from x where y = 4 group by sup
)
Run Code Online (Sandbox Code Playgroud)

这工作正常,我得到了我期望的结果。

我想要的是将这些结果分组在 sup 列中。当我GROUP …

db2 pivot

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

如何将 DBCC SHRINKFILE 的结果保存到表中?

我有以下脚本:

-- available space in each of the database files

PRINT @@SERVERNAME
--SQLDWDEV01
USE [BodenStage]
GO
SELECT name 
,(CAST(ROUND((size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS int)/128.0),2) AS NUMERIC(18,2))) AS AvailableSpaceInMB  
,(CAST(ROUND((size/128.0 - FILEPROPERTY(name, 'SpaceUsed')/128.0)/1024.00,2) AS NUMERIC(18,2))) AS AvailableSpaceInGB 
FROM sys.database_files;  
GO
Run Code Online (Sandbox Code Playgroud)

尽管我不喜欢既不收缩数据也不收缩日志文件,但有时需要这样做。不是我的错。

有方法,以缩小数据文件,而无须描述累积碎片在这里

仅截断

将文件末尾的所有可用空间释放给操作系统,但不会在文件内执行任何页面移动。数据文件仅收缩到最后分配的范围。

如何将DBCC SHRINKFILE的结果保存到表中?

请参见下文,这是将DBCC SQLPERF的结果保存到表中的一种方法。

select @@servername as [Server]
       ,db_name() as [database]
go

SET NOCOUNT ON

begin try
  drop table #radhe
end try
begin catch
end catch


create table #radhe …
Run Code Online (Sandbox Code Playgroud)

sql-server dbcc pivot sqlcmd xp-cmdshell

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

仅使用 Excel 读取 SSAS Cube 的安全权限

我在 SQL Server 2008 服务器上设置了 SSAS 数据库。我为一组用户设置了一个角色,我希望能够访问该数据库中的多维数据集。无论它说什么,我都设置了“读取定义”和“读取访问”,但这似乎不起作用。

用户可以打开我之前设置的数据透视表,但不会显示任何时间,但维度数据会显示得很好(用户、部门等)。

然后我设置了一个个人用户并给了他们完全控制权(管理员),效果很好。我缺少什么可以让他们正确访问多维数据集?进程数据库?还有什么?

sql-server-2008 security ssas pivot

4
推荐指数
1
解决办法
7335
查看次数

动态支点:每月销售额总和

我的表是这样的:

Sitecode    Month  Amount
--------    -----  ------
XX          Jan     1000
XX          Jan     3000
XX          Apr     3000
XX          Apr     1000
Run Code Online (Sandbox Code Playgroud)

我想要的是,显示这样的结果:

Sitecode    MonthJAN   MonthAPR
--------    --------   --------
XX          4000       4000
Run Code Online (Sandbox Code Playgroud)

sql-server pivot dynamic-sql

4
推荐指数
2
解决办法
7万
查看次数

两行分成两列

我有这张桌子:

Name        Value      Sequence    
-------------------------------    
test        A1         1           
test        A2         3           
test2       A20        5         
test2       A10        8         
Run Code Online (Sandbox Code Playgroud)

我在对名称进行分组并获得 Value+ 和 Value- 之后,如下所示:

Name        Value+         Value-    
-----------------------------------    
test        A1             A2          
test2       A20            A10         
Run Code Online (Sandbox Code Playgroud)

规则是:

  • 来自具有较低序列的行的值转到值+
  • 具有较高序列的行的值变为值-
  • 每个名字只有两行

我该怎么做?

sql-server pivot

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

重塑数据的技巧,类似于枢轴?

我有一个级别和年份表,大致如下所示:

INSERT INTO demo(first_name, rank, year) AS VALUES
  ('Peter',2,2017), ('Robert',3,2016), ('Evelyn',2,2017), 
  ('Rand',3,2017), ('Kofi',3,2017), ('Daniel',3,2016), ('Leonard',1,2017),
  ('Mary',1,2017), ('Frank',1,2017), ('John',3,2017), ('Mary',1,2016), 
  ('Gilbert',3,2016), ('Quince',2,2017), ('David',3,2017), ('Louis',2,2017),
  ('Felipe',2,2016), ('Alfonso',1,2017), ('Elise',3,2016), ('Jorge',3,2017),
  ('Mary',3,2016), ('Jasvant',2,2017), ('Paul',3,2017), ('Richard',2,2017),
  ('Christopher',2,2017), ('Johannes',2,2016), ('Nasser',3,2016), ('Bruce',3,2017), 
  ('John',3,2016), ('Frederic',3,2016);
Run Code Online (Sandbox Code Playgroud)

我可以用一个非常基本的方法捕获每个级别和年份的总数COUNT()

SELECT  rank, COUNT(*), year
FROM demo
GROUP BY rank, year
ORDER BY year, rank;
Run Code Online (Sandbox Code Playgroud)

这给了我一个相当整洁的演示数据摘要:

Rank  Count  Year
1      1    2016
2      2    2016
3      8    2016
1      4    2017
2      7    2017
3      7    2017
Run Code Online (Sandbox Code Playgroud)

我的实际数据要大得多,我希望能够在一个看起来更像这样的汇总表中看到它:

Rank    2016    2017 …
Run Code Online (Sandbox Code Playgroud)

postgresql pivot

4
推荐指数
1
解决办法
1354
查看次数