我有以下查询,我希望老化配置文件显示为新列我的老化配置文件为 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 的新手,只是想学习所以很抱歉,因为这是基本的东西谢谢
我Enum在编程语言级别有一个 an ,它作为一个简单的整数存储在表上。思考:
APPLE = 1
GOOGLE = 2
MSFT = 3
AMAZON = 4
... (100s more)
Run Code Online (Sandbox Code Playgroud)
我只想查询表而不是数字返回相应的字符串值。在不使用case语句或临时表的情况下,是否有更简单的方法来执行此操作:
SELECT
CASE WHEN type = 1 THEN "APPLE"
CASE WHEN type = 2 THEN "GOOGLE"
CASE WHEN type = 3 THEN "MSFT"
CASE WHEN type = 4 THEN "AMAZON"
...
ELSE "UNKNOWN"
FROM t
Run Code Online (Sandbox Code Playgroud)
基本上它只是在字典中进行键查找。
我正在尝试使用 CASE 表达式来选择每行应与哪个表连接。
假设我的游戏中有一个 item_instances 表,其中包含游戏世界中的所有项目,其中一些项目是 item_templates 表中通用项目的千篇一律的副本,而其他项目则以模板开始,然后当玩家使用它们时获得独特的属性。它们现在存储在 unique_items 表中。
因此,当我在 item_instances 表中找到某个项目的记录时,我想查找有关它的更多信息,并且需要从正确的表中提取该信息。
这是我一直在尝试但没有成功的事情:
SELECT item_table, item_id, *
FROM item_instances AS ii
JOIN
CASE ii.item_table
WHEN 0 THEN 'item_templates'
WHEN 1 THEN 'unique_items'
ELSE 'unique_items'
END
ON CASE = ii.item_id;
Run Code Online (Sandbox Code Playgroud)
如果有语法的快速修复,我很想听听。或者,如果这是您在概念上无法做到的事情 - 让每一行选择自己的连接 - 我很乐意获得更深入解释的链接。
过去,我通过执行两个 SELECT 来完成类似的操作,其中一个针对 item_templates 表,另一个针对 unique_items 表,并采用它们的 UNION。这感觉是一种更正确且更少浪费的方法。如果不是出于某种原因与 SQL 更深层次的架构有关,我想了解为什么。
我有一张ROAD桌子:
+----+------------+
| ID | ROAD_CLASS |
+----+------------+
| 1 | ARTERIAL A |
| 2 | ARTERIAL B |
| 3 | ARTERIAL B |
| 4 | ARTERIAL C |
| 5 | ARTERIAL C |
| 6 | ARTERIAL C |
| 7 | COLLECTOR |
| 8 | COLLECTOR |
| 9 | LOCAL |
| 10 | LOCAL |
+----+------------+
Run Code Online (Sandbox Code Playgroud)
该ROAD_CLASS字段的数据类型是NVARCHAR2.
我想创建一个视图,将所有主干道路分组到一个ARTERIAL类别中,但将其他道路类保留原样:
+------------+
| ROAD_CLASS |
+------------+ …Run Code Online (Sandbox Code Playgroud) 我正在使用 PostgreSQL 11。我想有条件地将值插入表中,同时插入的结果包括null未导致插入的输入的每一行。
例如
CREATE TABLE all_sums (sum INTEGER);
SELECT
CASE WHEN a_sum IS NULL THEN null
ELSE (SELECT sum FROM (INSERT INTO sums (sum) VALUES (sum) RETURNING sum))
END
FROM
(SELECT a + b FROM (VALUES (1, null), (null, 2), (2, 3)) AS row (a, b))
AS a_sum;
Run Code Online (Sandbox Code Playgroud)
应该导致表格all_sums看起来像:
all_sums: sum
------
5
(1 row)
Run Code Online (Sandbox Code Playgroud)
但查询的输出应该是:
null
null
5
------
(3 rows)
Run Code Online (Sandbox Code Playgroud)
此示例因语法错误而失败:
ERROR: syntax error at or near "INTO"
Run Code Online (Sandbox Code Playgroud)
有什么方法可以实现所需的查询输出?
(对于上下文:我这样做的原因是因为还有进一步的查询依赖于知道插入是否发生在特定行上。
这是通过将我的查询从每行一个转换为每列一个来更有效地从文件中插入一些数据的努力的一部分。不过,我不是在寻找其他提高插入速度的技巧,如果不可能,我很高兴在这一点上结束。)
I am using a CASE expression in my WHERE clause like this:
SELECT *
FROM ASPECT.WR_AM_ADT_SUMM
INNER JOIN ASPECT.WR_AM_DLR_DTL
ON AS_CNTRY_CD = DD_CNTRY_CD AND
AS_DLR_CD = DD_DLR_CD AND
AS_YEAR = DD_YEAR
RIGHT JOIN ASPECT.DEALER_MASTER
ON COUNTRY_CD = AS_CNTRY_CD AND
DEALER_CDE_VEGA = AS_DLR_CD
WHERE
COUNTRY_CD = '81930' AND
LANG_CD = '02' AND
(CASE PARM_ADTR_ID
WHEN 'ALL' THEN (AS_ADTR_ID_P IS NULL OR AS_ADTR_ID_P LIKE '%')
ELSE AS_ADTR_ID_P LIKE LOC_ADTR_ID
END) AND
DEALER_CDE_VEGA LIKE '8%'
;
Run Code Online (Sandbox Code Playgroud)
In the above query when I pass …
我有以下变量和 CASE 语句:
DECLARE @DATE_VALUE VARCHAR(20) = '4/29/2021'
DECLARE @CONVERT_CODE VARCHAR(1) = 'I'
SELECT CASE @CONVERT_CODE WHEN 'I' THEN DATEDIFF(day, '04/21/2021', @DATE_VALUE)
END AS ConvertedValue
Run Code Online (Sandbox Code Playgroud)
它没有什么特别之处。正如我所期望的那样,它返回 8 (int)。
但是,一旦我将返回日期时间数据类型的条件添加到我的 CASE 语句中,我就不再得到 8 (int),尽管继续使用“I”作为 @CONVERT_CODE 值。
DECLARE @DATE_VALUE VARCHAR(20) = '4/29/2021'
DECLARE @CONVERT_CODE VARCHAR(1) = 'I'
SELECT CASE @CONVERT_CODE WHEN 'I' THEN DATEDIFF(day, '04/21/2021', @DATE_VALUE)
WHEN 'D' THEN GETDATE()
END AS ConvertedValue
Run Code Online (Sandbox Code Playgroud)
相反,我得到“1900-01-09 00:00:00.000”的日期时间值
我认为“D”根本不应该被评估,因为在 SQL Server 中,一旦条件评估为真(在这种情况下为“I”),它应该脱离 CASE 语句——所以我不确定为什么“D”的数据类型会影响整体返回数据类型。另外,如果我颠倒条件的顺序并仍然使用“I”也没关系:
DECLARE @DATE_VALUE VARCHAR(20) = '4/29/2021'
DECLARE @CONVERT_CODE VARCHAR(1) = 'I'
SELECT …Run Code Online (Sandbox Code Playgroud) 我如何在本示例(Oracle 数据库)中pop进一步使用别名case。
select
(select sum(ccs_pop) from rap4) as pop,
case
when pop+x=a+b+c then pop+x
end as sum1,
case
when pop+y=d+e+f then pop+y
end as sum2
from rap4
Run Code Online (Sandbox Code Playgroud)
想法是我在复杂的情况下需要“pop”,并且在很多句子中都需要“pop”,我需要使用别名或其他东西......
下面的简单查询有什么问题?我试着用谷歌搜索但没有找到
IF 1 = 1 THEN
SELECT 1;
ELSE
SELECT 12;
END IF;
Run Code Online (Sandbox Code Playgroud) 在《SQL 入门》一书中,Thomas Nield 谈到了一种他称之为“零/空情况技巧”的技术:
有一个简单但功能强大的工具,可以将不同的过滤条件应用于不同的聚合。我们可以在两个单独的列中创建龙卷风存在与不存在时的单独总计数:
Run Code Online (Sandbox Code Playgroud)SELECT year, month, SUM(CASE WHEN tornado = 1 THEN precipitation ELSE 0 END) as tornado_precipitation, SUM(CASE WHEN tornado = 0 THEN precipitation ELSE 0 END) as non_tornado_precipitation FROM station_data WHERE year >= 1990 GROUP BY year, month我们有效地做的就是当tornado = 1 或tornado = 0 时去掉WHERE 条件,然后将这些条件移至SUM() 函数内的CASE 表达式。如果满足条件,则将降水值添加到总和中。如果不是,则添加 0,但没有效果。我们对两列进行这些操作,分别针对龙卷风存在时和不存在龙卷风时进行。
您可以使 CASE 表达式具有所需数量的条件/值对,从而使您能够通过聚合对值进行高度特定的截取。您还可以使用此技巧来模拟交叉表和数据透视表,将聚合表示为单独的列而不是行。一个常见的示例是进行当年/上一年分析,因为您可以使用不同的列来表示不同的年份。
作为新手,该技术似乎对于总结数据非常有用。我想在线查找该技术以获取更多信息。
该书的作者将该技术称为“零/空案例技巧”。但当我用谷歌搜索这个词时,我没有得到很多结果。
问题:
该技术有一个普遍接受的名称吗?(在线搜索时会产生更多结果)
case ×10
oracle ×3
postgresql ×3
sql-server ×2
sum ×2
alias ×1
datatypes ×1
db2 ×1
group-by ×1
insert ×1
join ×1
mysql ×1
oracle-12c ×1
oracle-19c ×1
pivot ×1
query ×1
subquery ×1
terminology ×1