这是一个复杂的解释,很抱歉,这将是一堵文字墙。我正在处理预先存在的代码并试图找出解决方案,所以我无法改变其中任何一个工作的核心方式。
本质上,我在一个项目中有一系列表单,所有这些表单都有一个分配给它们的状态。状态具有指定的优先顺序,这将逐渐向上级访问。当前的工作方式使用以下 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,因为状态名称可能会改变。
简而言之,我需要它按照通过该字符串传入的顺序对状态名称进行排序或分组。
我编写的以下查询在一定程度上起作用。我发现的问题是,在每个泵中,电缆等都可以在每个零件列中列出。例子:
我想得到的是列有每个泵、电缆等的井,而不是我目前得到的只是第一个泵、电缆等。
这是我正在运行的查询:
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) 表中有以下数据:
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。
假设这两个表:
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)
如果我有固定数量的运行值,这很容易做到,但是是否可以创建一个动态查询,无论运行次数如何,它都会输出正确的内容?
我已经查看了整个网站,但找不到解决我的问题的方法。我试图尽可能地抽象它。
我的查询是这样的:
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 …
我有以下脚本:
-- 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 2008 服务器上设置了 SSAS 数据库。我为一组用户设置了一个角色,我希望能够访问该数据库中的多维数据集。无论它说什么,我都设置了“读取定义”和“读取访问”,但这似乎不起作用。
用户可以打开我之前设置的数据透视表,但不会显示任何时间,但维度数据会显示得很好(用户、部门等)。
然后我设置了一个个人用户并给了他们完全控制权(管理员),效果很好。我缺少什么可以让他们正确访问多维数据集?进程数据库?还有什么?
我的表是这样的:
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) 我有这张桌子:
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)
规则是:
我该怎么做?
我有一个级别和年份表,大致如下所示:
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) pivot ×10
postgresql ×3
sql-server ×3
db2 ×1
dbcc ×1
dynamic-sql ×1
optimization ×1
oracle ×1
security ×1
sqlcmd ×1
ssas ×1
t-sql ×1
xp-cmdshell ×1