是否有一个更简单的 T-SQL 构造“所有这些列在一行上都相等(忽略 NULL)” - 我想说有效:
WHERE MIN(a, b, c) = MAX(a, b, c) OR COALESCE(a, b, c) IS NULL
Run Code Online (Sandbox Code Playgroud)
3 列的替代方法是:
WHERE (
COALESCE(a, b, c) = COALESCE(b, c, a)
AND COALESCE(a, b, c) = COALESCE(c, a, b)
AND COALESCE(a, b, c) = COALESCE(b, a, c)
AND COALESCE(a, b, c) = COALESCE(a, c, b)
AND COALESCE(a, b, c) = COALESCE(c, b, a)
)
OR COALESCE(a, b, c) IS NULL
Run Code Online (Sandbox Code Playgroud)
即“所有非空列 a、b、c 必须相等,否则所有列都可能为空” …
我在 Oracle 中使用 PIVOT 函数并且很好奇是否可以用零替换空值?我知道我可以将整个查询包装在另一个 SELECT 中,然后对值使用 COALESCE,但我很好奇是否有快捷方式。
我有一个包含以下字段的表:
p1
p2
s1
s2
Run Code Online (Sandbox Code Playgroud)
其中 p1 -> player1, p2 -> player2, s1 -> game1, s2 -> game2 玩家的数量可以从 3 - 10 不等。表中有他们之间的结果。例如,假设我们有 4 名球员:TIM、ROB、NICK、GEORGE 以及他们之间的比赛:
p1 p2 s1 s2
TIM ROB 4 0
NICK GEORGE 4 0
TIM NICK 0 4
ROB GEORGE 4 0
TIM GEORGE 4 0
ROB NICK 4 0
Run Code Online (Sandbox Code Playgroud)
我想用查询产生的东西是这样的:
TIM ROB NICK GEORGE
TIM X 4-0 0-4 4-0
ROB 0-4 X 4-0 4-0
NICK 0-4 4-0 X 4-0
GEORGE 0-4 0-4 0-4 X
Run Code Online (Sandbox Code Playgroud)
在 …
我有一个表,其中包含文本数据,其中包含一堆不同语言的翻译。每个翻译都是针对特定标签的。
我需要生成一个数据透视表,以便快速获取缺少的内容。
记录的一个例子是
1, en, hello
1, fr, bonjour
1, es, hola
2, en, how are you
2, fr,
3, es, come es stas
Run Code Online (Sandbox Code Playgroud)
尽管所有语言的翻译都应始终存在,但我不能 100% 确定情况确实如此。因此必须考虑缺失字段。
想要的结果是这样的
|ID|EN|FR|ES|
|1|hello|bonjour|hola|
|2|how are you| |come es stas|
Run Code Online (Sandbox Code Playgroud)
我面临的挑战是填充数据库时列顺序可能并不总是相同,因此理论上我应该有一个动态字段列表。
SQLite 中没有直接的 PIVOT 函数,因此我开始尝试使用 group_concat 获取逗号分隔的字符串。
SELECT DISTINCT language, group_concat(word, ',') OVER (PARTITION BY language) AS group_concat
FROM vocabulary;
Run Code Online (Sandbox Code Playgroud)
如果需要的话,我可以稍后在 Python 中运行结果;问题是任何缺失值都不会附加空项,从而将所有串联移动 n,从而使该解决方案无效。
我还尝试在选择谓词中使用过滤子句(尽管这意味着对列进行硬编码),但我未能成功。
关于如何实现这一目标有什么想法吗?
使用 PostgreSQL 9.1,所以WITH ORDINAL(9.4 特性)不可用。
希望简化旋转二维数组的代码。
一个说明问题的工作,过于冗长的例子是:
SELECT
u.aspect,
u.preference
FROM (
SELECT
t.aspect_preference AS aspect,
-- Skip every second row
seq % 2 AS seq,
lead( aspect_preference, 1 ) OVER (ORDER BY t.seq) AS preference
FROM (
SELECT
unnest( '{ {"COLOUR_SCHEME", "RASPBERRY_BLISS"}, {"FONT", "TERMES_HEROS"}, {"LIST_LAYOUT", "BULLET_SNOWFLAKE"} }'::text[] ) aspect_preference,
-- Maintain array order after unnesting to a result set
generate_series( 1,
(array_ndims( '{ {"COLOUR_SCHEME", "RASPBERRY_BLISS"}, {"FONT", "TERMES_HEROS"}, {"LIST_LAYOUT", "BULLET_SNOWFLAKE"} }'::text[] ) *
array_length( '{ …Run Code Online (Sandbox Code Playgroud) 我有一张看起来像这样的表:
RECIPE VERSION_ID INGREDIENT PERCENTAGE
4000 100 Ing_1 23,0
4000 100 Ing_100 0,1
4000 200 Ing_1 20,0
4000 200 Ing_100 0,7
4000 300 Ing_1 22,3
4000 300 Ing_100 0,9
4001 900 Ing_1 8,3
4001 900 Ing_100 72,4
4001 901 Ing_1 9,3
4001 901 Ing_100 70,5
5012 871 Ing_1 45,1
5012 871 Ing_100 0,9
5012 877 Ing_1 47,2
5012 877 Ing_100 0,8
5012 879 Ing_1 46,6
5012 879 Ing_100 0,9
5012 880 Ing_1 43,6
5012 880 Ing_100 1,2
Run Code Online (Sandbox Code Playgroud)
每个配方/版本有 100 种成分。我想像这样显示这个表中的数据: …
经过多次搜索,我找不到如何做到这一点。
我的网络搜索得到 Pivots 和 Concats 以及 Cases 和 Subqueries 等,但没有一个能很好地解决我的问题。多行到单行的问题对我没有帮助。
问题:
一张桌子上有个人。另一个表中有这些个人的地址(有时是多个)。我需要一个查询来将每个个人的多个地址放在一行(在适当的列中)。
这是一个带有表和查询的 MySQL Fiddle:
在那个 SQL Fiddle 中,结果有 6 个独特个体的 9 条记录:
Number | Name | EyeColor | HairColor | Street | City | State | Zip | Street2 | City2 | State2| Zip2 | Street3 | ...
1 | John Smith | blue | red | 100 Pine Street | New York | NY | 10019 | | | | 0 | | ...
2 …Run Code Online (Sandbox Code Playgroud) 我有一张几百列宽的桌子。有没有办法将每一行转换为包含列标题的单个串联字符串,而不必列出查询中的每一列?
我这样做是因为列代表事件报告中的字段。我将它们重新组合在一起,以便人们可以以合乎逻辑的方式阅读报告。
我已经通过查询完成了其中的一些工作,但是为每一列都做起来很费力,而且似乎容易出错。
这是一个简短的片段,显示以我需要的格式连接的三列,在逐列方法中完成:
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)
谢谢
我有以下查询,我希望老化配置文件显示为新列我的老化配置文件为 0-30、31-60、61-90、91-120、121-180、181-365、365+
我基本上希望结果出现在网络到期时出现在适当的老化支架中。
BU 0-30 31-60 61-90 91-120 121-180 181-365 365+
--------------------------------------------------------------
A
B
C
Run Code Online (Sandbox Code Playgroud)
询问:
select
BU,
Ageing,
sum(NetDue) as Netdue
from [dbo].[vw_FACT_CONSOL_CREDITORS]
where date = @date
Group by BU, Ageing
Order by BU ;
Run Code Online (Sandbox Code Playgroud)
我是 SQL 的新手,只是想学习所以很抱歉,因为这是基本的东西谢谢
我有一个我无法解决的问题。
我的查询是:
SELECT
f.Title, p.StartOfShowing
FROM
PlayDates p
INNER JOIN
PlayDateSections ps ON p.PlayDateId = ps.PlayDateId
INNER JOIN
Films f ON p.FilmId = f.FilmId
WHERE
DATEDIFF(d, p.StartOfShowing, '2018-04-30') = 0
Run Code Online (Sandbox Code Playgroud)
表的结果是这样的:
A Quiet Place 2018-04-30 12:40
A Quiet Place 2018-04-30 15:05
A Quiet Place 2018-04-30 17:30
A Quiet Place 2018-04-30 19:55
A Quiet Place 2018-04-30 22:20
Avengers : Infinity War 2018-04-30 11:10
Avengers : Infinity War 2018-04-30 11:30
Avengers : Infinity War 2018-04-30 12:00
Avengers : Infinity War 2018-04-30 13:00 …Run Code Online (Sandbox Code Playgroud)