AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题

问题[case](dba)

Martin Hope
GeoH
Asked: 2022-04-14 08:42:41 +0800 CST

我有一个表,其中每个 project_id 生成多行

  • -2

我的下表显示了使用 CASE 语法过滤列数据以区分资本和费用的行和列。问题是每个project_ID 我得到多行。我需要每个 project_ID 一行: 在此处输入图像描述

我需要输出为:

在此处输入图像描述 这是我的 Oracle SQl(包括上面未显示的许多其他列):

SELECT
    pi.project_id,
    pi.project_projectnumber, 
    pi.project_projectname, 
    cst.cost1,

    CASE WHEN bi.code = '01-00-000' THEN  cst.ubr_ROM_Approved
         ELSE NULL
    END AS CAPITAL_ROM,  

    CASE WHEN bi.code = '02-00-000' 
         THEN cst.ubr_ROM_Approved
         ELSE NULL
    END AS EXPENSE_ROM,  

    CASE WHEN bi.code = '01-00-000' 
         THEN cst.ubacf_CD_Approved
         ELSE NULL
    END AS CAPITAL_ADJ_CD,  

    CASE WHEN bi.code = '01-00-000' 
         THEN cst.ubacf_SD_Approved
         ELSE NULL
    END AS CAPITAL_ADJ_SD,  

    CASE WHEN bi.code = '01-00-000' 
         THEN cst.ubacf_DD_Approved
         ELSE NULL
    END AS CAPITAL_ADJ_DD,  

    CASE WHEN bi.code = '01-00-000' 
         THEN cst.ubacf_Budget_Approved
         ELSE NULL
    END AS CAPITAL_ADJ_Budget,  

    CASE WHEN bi.code = '02-00-000' 
         THEN cst.ubacf_CD_Approved
         ELSE NULL
    END AS EXPENSE_ADJ_CD,  

    CASE WHEN bi.code = '02-00-000' 
         THEN cst.ubacf_SD_Approved
         ELSE NULL
    END AS EXPENSE_ADJ_SD,  

    CASE WHEN bi.code = '02-00-000' 
         THEN cst.ubacf_DD_Approved
         ELSE NULL
    END AS EXPENSE_ADJ_DD,  

    CASE WHEN bi.code = '02-00-000' 
         THEN cst.ubacf_Budget_Approved
         ELSE NULL
    END AS EXPENSE_ADJ_Budget


FROM turnerb_upi_view pi
INNER JOIN turnerb_sys_project_info_view pv ON (pv.pid = pi.project_id)
INNER JOIN turnerb_us_p1_view prj ON (prj.pid = pi.project_id)
INNER JOIN turnerb_budget_summary_viewb cst ON (cst.projectid = pi.project_id)
INNER JOIN turnerb_ubr_view rom ON (rom.project_id = pi.project_id)
INNER JOIN turnerb_ubacf_view badj ON (badj.project_id = pi.project_id)
INNER JOIN turnerb_budgetitem bi ON (bi.budgetid = cst.budgetid)

WHERE pi.project_status = '1' 
AND rom.status ='ROM_Approved' 
AND (badj.status = 'SD_Approved' 
     OR badj.status = 'CD_Approved' 
     OR badj.status = 'DD_Approved' 
     OR badj.status = 'Budget_Approved')

GROUP BY 
    pi.project_id,
    pi.project_projectnumber, 
    pi.project_projectname, 
    bi.code,
    cst.cost1,
    cst.ubr_ROM_Approved,
    cst.ubacf_CD_Approved,
    cst.ubacf_SD_Approved,
    cst.ubacf_DD_Approved,
    cst.ubacf_Budget_Approved

ORDER BY project_projectnumber;
oracle case
  • 2 个回答
  • 31 Views
Martin Hope
JJM50
Asked: 2021-10-13 04:39:48 +0800 CST

查询获取列中所有唯一条目的总和

  • 0

目前我正在使用 mysql 返回具有相同单词的列中所有数据的总和。为此,我使用以下查询:

SELECT SUM(CASE WHEN status_to = 'Draft' THEN 1 END) AS draft, 
SUM(CASE WHEN status_to = 'Unpublish' THEN 1 END) AS unpublish, 
SUM(CASE WHEN status_to = 'Publish' THEN 1 END) AS publish, 
SUM(CASE WHEN status_to = 'Action' THEN 1 END) AS action, 
SUM(CASE WHEN status_to = 'Unlisted' THEN 1 END) AS unlisted, 
SUM(CASE WHEN status_to = 'Sold' THEN 1 END) AS sold, 
SUM(CASE WHEN status_to = 'Let' THEN 1 END) AS let 
FROM `crm_logs`

这会在我的数据库中为我指定的所有术语提供正确的输出,但现在我发现数据库中除了上面指定的变量之外还有更多的状态变量。所以我想要一种方法来拥有与该语句相同的功能,但使状态变量动态化。

基本上,如果这是查询,SUM(CASE WHEN status_to = 'Draft' THEN 1 END) AS draft则草稿的出现都应该是动态的。

mysql case
  • 3 个回答
  • 387 Views
Martin Hope
User1974
Asked: 2021-09-06 23:23:51 +0800 CST

零/空案例技巧

  • 2

在《SQL 入门》一书中,Thomas Nield 谈到了一种他称之为零/空案例技巧的技术:

有一个简单但功能强大的工具可以将不同的过滤条件应用于不同的聚合。当龙卷风存在与不存在于两个单独的列中时,我们可以创建单独的总计数:

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 表达式具有尽可能多的条件/值对,从而使您能够使用聚合对值进行高度特殊的截取。您还可以使用此技巧来模拟交叉表和数据透视表,将聚合表示为单独的列而不是行。一个常见的例子是进行当年/上一年的分析,因为您可以用不同的列表示不同的年份。


作为一个新手,该技术似乎可以非常方便地汇总数据。我想在网上查找该技术,以便可以在书籍或其他资源中找到类似的其他技术。

那本书的作者称该技术为“零/空案例技巧”。但是当我用谷歌搜索这个词时,我没有得到很多结果。

问题:

该技术是否有一个普遍接受的名称?(在线搜索时会产生更多结果)

oracle case
  • 2 个回答
  • 264 Views
Martin Hope
linux478
Asked: 2021-02-20 06:07:32 +0800 CST

SQLite:如何使用 sum 函数

  • 1

我使用的代码在这里

CREATE TABLE timecard (
   id INTEGER PRIMARY KEY autoincrement,
   clock_in REAL not null,
   clock_out REAL,
   lunch integer,
   pay_type TEXT
);
INSERT INTO timecard VALUES(1,julianday("2021-02-15 08:00"),julianday("2021-02-15 16:00"),0,"HOLIDAY");
INSERT INTO timecard VALUES(2,julianday("2021-02-16 07:23"),julianday("2021-02-16 16:49"),1,"WORK");
INSERT INTO timecard VALUES(3,julianday("2021-02-17 07:16"),julianday("2021-02-17 16:05"),1,"WORK");
INSERT INTO timecard VALUES(4,julianday("2021-02-18 07:54"),julianday("2021-02-18 15:48"),1,"WORK");

.header on
.mode column

SELECT strftime('%W',clock_in) AS 'weekofyear',
       time(clock_in) as "IN",
       time(clock_out) as "OUT",
       CASE when lunch = 1 then round(Cast (( JulianDay(clock_out) - JulianDay(clock_in)) * 24 - .5 As REAL),2)
            when lunch = 0 then round(Cast (( JulianDay(clock_out) - JulianDay(clock_in)) * 24 As REAL),2)
       END as "total_time",
       sum("total_time")
FROM timecard
GROUP BY "weekofyear";

这是命令的输出。

weekofyear  IN          OUT         total_time  sum("total_time")
----------  ----------  ----------  ----------  -----------------
07          08:00:00    16:00:00    8.0         0.0

我正在尝试获取一年中一周的总小时数。不确定我做错了什么。我对 SQL 和 SQL 中的 case 语句很陌生。

谢谢你的时间

sqlite case
  • 1 个回答
  • 119 Views
Martin Hope
Jeremy Thompson
Asked: 2020-11-10 21:47:22 +0800 CST

带有动态 Case 子句的查询或如何避免 Case When

  • 1

让我们使用 CASE 子句进行日常查询,以便向您展示问题,看看当新的认证出现时我们必须如何更改查询:

select count(*) as "certCount",
CASE
when c.id = 1 then 'AWS Cloud Practitioner'
when c.id = 2 then 'AWS Alexa Skill Builder'
when c.id = 3 then 'AWS Solution Architect Associate'
when c.id = 4 then 'AWS Developer Associate'
when c.id = 5 then 'AWS SysOps Associate'
when c.id = 6 then 'AWS Solution Architect Professional'
when c.id = 7 then 'AWS DevOps Professional'
when c.id = 8 then 'AWS Security'
when c.id = 9 then 'AWS Networking'
when c.id = 10 then 'AWS Big Data'
when c.id = 11 then 'AWS Machine Learning'
ELSE 'N/A'
END AS name
from certification c
inner join qualification q on c.id = q.certificationid
group by q.certificationid, c.id

当然,我们可以生成 SQL 并以 Ad-Hoc 方式执行它。这是我过去所做的,尽管我想知道是否有另一种方式,比如某种加入方式可以避免 CASE WHENs?


下面的模式和示例数据,它在 PostGres 中,但我也对 Oracle、SQLServer 等的动态案例语句感兴趣:

 CREATE TABLE certification (
    id serial NOT NULL,
    officialcertname text NOT NULL,
    "name" text NOT NULL,
    vendorid int4 NOT NULL DEFAULT 1,
    isdeleted bool NOT NULL DEFAULT false,
    CONSTRAINT certification_pkey PRIMARY KEY (id)
);

CREATE TABLE qualification (
    id serial NOT NULL,
    employeeid int4 NOT NULL,
    certificationid int4 NOT NULL,
    date_attained timestamptz NULL,
    date_expiry timestamptz NULL,
    certurl text NULL,
    verified bool NOT NULL DEFAULT false,
    created_by text NOT NULL,
    created_date timestamptz NOT NULL,
    modified_by text NULL,
    modified_date timestamptz NULL,
    CONSTRAINT qualification_pkey PRIMARY KEY (id)
);


INSERT INTO certification (officialcertname,"name",vendorid,isdeleted) VALUES 
('AWS Certified Cloud Practitioner (CLF)','AWS Cloud Practitioner',1,false)
,('AWS Certified Alexa Skill Builder','AWS Alexa Skill Builder',1,false)
,('AWS Certified Solutions Architect - Associate (SAA)','AWS Solution Architect Associate',1,false)
,('AWS Certified Developer - Associate (DVA)','AWS Developer Associate',1,false)
,('AWS Certified SysOps Administrator - Associate (SOA)','AWS SysOps Associate',1,false)
,('AWS Certified Solutions Architect - Professional (SAP)','AWS Solution Architect Professional',1,false)
,('AWS Certified DevOps Engineer - Professional (DOP)','AWS DevOps Professional',1,false)
,('AWS Certified Security - Specialty (SCS)','AWS Security',1,false)
,('AWS Certified Networking - Specialty (SNS)','AWS Networking',1,false)
,('AWS Certified Big Data - Specialty','AWS Big Data',1,false)
;
dynamic-sql case
  • 1 个回答
  • 62 Views
Martin Hope
Karol Daniluk
Asked: 2020-11-10 13:46:37 +0800 CST

将 CASE WHEN 输出保留为 MySQL 中的新列

  • 0

我是 MySQL 新手,这个问题可能看起来很傻,但是:

我有一张dogs桌子,我按重量对它们的大小进行分类:

SELECT *,
    CASE
        WHEN weight < 15 THEN 'Small'
        WHEN weight < 40 THEN 'Medium'
        ELSE 'Big'
    END AS Size
FROM dogs;

这会输出我的表格,最后有一个新列Size。我想将该列永久附加到此表中,以便在我使用时可见SELECT * FROM dogs;

mysql case
  • 1 个回答
  • 34 Views
Martin Hope
Aldee
Asked: 2020-08-05 22:58:26 +0800 CST

MySQL CASE WHEN 不能按预期使用用户定义的变量?

  • -1

我需要以下查询的帮助。我正在从 DB 中提取邮政编码 ( plz) 和用户 ID ( uid),并通过 zip (plz) 和 uid 对它们进行排序。我还使用用户定义的变量@prev来检查previous plz 是否不同于current plz. 在此 CASE 列rownum中,应将起始用户定义变量减@row1。

这是我对此的查询..

SELECT   
  @prev as previous, @prev := u.plz as current, 
  CASE 
    WHEN @prev is null THEN @row := @row -1 
    WHEN @prev <> u.plz THEN @row := @row -1
    ELSE @row END AS rownum, 
  uid

FROM             
  (SELECT @prev := NULL, @row := 1001) as r, user as u

LEFT JOIN 
  geodb_locations ON u.plz = geodb_locations.id 
WHERE 
  u.plz IN(29386,30013,29271,30406) AND
ORDER BY 
  FIELD(u.plz,29386,30013,29271,30406), 
  uid DESC

输出

+----------+---------+--------+-------+
| previous | current | rownum | uid   |
+----------+---------+--------+-------+
| NULL     |   29386 |   1001 | 92014 | <-- @prev <> u.plz why NOT decreasing `rownum`
| 29386    |   29386 |   1001 | 87223 |
| 29386    |   29386 |   1001 | 83160 |
| 29386    |   29386 |   1001 | 81322 |
| 29386    |   29386 |   1001 | 81293 |
| 29386    |   29386 |   1001 |  3152 |
| 29386    |   29386 |   1001 |  1939 |
| 29386    |   30013 |   1001 | 65193 | <-- @prev <> u.plz why NOT decreasing `rownum`
| 30013    |   29384 |   1001 | 12883 |
| 29384    |   29385 |   1001 | 32667 |
| 29385    |   29232 |   1001 | 86641 |
| 29232    |   29481 |   1001 | 94521 |
| 29481    |   29481 |   1001 | 33950 |
| 29481    |   29481 |   1001 | 33926 |
| 29481    |   29667 |   1001 | 16027 |
| 29667    |   29667 |   1001 |   496 |
| 29667    |   29355 |   1001 | 96013 |
+----------+---------+--------+-------+

预期产出

+----------+---------+--------+-------+
| previous | current | rownum | uid   |
+----------+---------+--------+-------+
| NULL     |   29386 |   1000 | 92014 | <-- decrease @row `rownum` by one
| 29386    |   29386 |   1000 | 87223 |
| 29386    |   29386 |   1000 | 83160 |
| 29386    |   29386 |   1000 | 81322 |
| 29386    |   29386 |   1000 | 81293 |
| 29386    |   29386 |   1000 |  3152 |
| 29386    |   29386 |   1000 |  1939 |
| 29386    |   30013 |    999 | 65193 | <-- decrease @row `rownum` by one 
| 30013    |   29384 |    998 | 12883 |
| 29384    |   29385 |    997 | 32667 |
| 29385    |   29232 |    996 | 86641 |
| 29232    |   29481 |    995 | 94521 |
| 29481    |   29481 |    995 | 33950 |
| 29481    |   29481 |    995 | 33926 |
| 29481    |   29667 |    994 | 16027 |
| 29667    |   29667 |    994 |   496 |
| 29667    |   29355 |    993 | 96013 |
+----------+---------+--------+-------+

为什么 CASE WHEN 不能按预期工作?我的思维错误在哪里?提前致谢 ..

mysql case
  • 1 个回答
  • 792 Views
Martin Hope
TheDemonLord
Asked: 2020-06-18 17:49:58 +0800 CST

根据评估条件返回具有一对多关系的单行

  • 0

数据库是 Postgres。

我有一个问题,我有一个包含以下列的表:ID、Product_ID Customer_ID、Price 和 Item_Type。

此表在 Product_ID 上连接到另一个表。对于给定的产品 ID,给定的商品类型(新品、续订、赎回等)有默认价格(其中 Customer_ID 为空白),还可能有一个客户特定的价目表(其中 Customer_ID 加入到客户表中)。

问题是该数据库维护不善。对于 Item_Type,我们对此期感兴趣的有 2 个价格:续订和续订。有些价格有续订价格,有些价格有续订价格,有些则两者兼有。

select p.id, pr.customer_id, p.period, pr.price, pr.item_type
from products p
right join prices pr on
pr.product_id = p.id and pr.period = p.period and pr.customer_id is null
where p.status = 'PURCHASED'

例如,这会产生以下内容:

121751  8407508 12 29.95 RENEW
121751  8407508 12 35.95 RENEWAL

原因是该产品有 2 个不同的续订和续订价格 - 查看前端应用程序代码 - 如果有 item_type 'RENEWAL' 则使用此价格,如果没有则使用 'RENEW' 价格。

我尝试在 select 和 where 子句中使用 case 语句:

case pr.item_type 
    when 'RENEWAL' then pr.price
    when 'RENEW' then pr.price
    end

但我仍然得到两行 - 我不确定如何进行条件和分层查找,例如,如果条件 A 匹配,则返回与条件 A 匹配的行,如果未找到匹配项,则条件 B 匹配,然后返回该行匹配条件 B 等。

postgresql case
  • 1 个回答
  • 414 Views
Martin Hope
Timmy Turner
Asked: 2020-06-09 05:20:53 +0800 CST

PostgreSQL CASE 表达式

  • 0

如何用 Postgres 编写 case 表达式?我有这个

case
  when rc.stat = 0 Then unpaid
  when rc.stat = 1 Then paid
  when rc.stat = 2 Then dispute
  else rc.stat
end

但是当我去运行语句时,我得到一个错误

Error: column "unpaid" does not exist

我还尝试了文本值周围的双引号和括号,但所有这些选项都会给我错误。请注意,未支付、已支付、争议的值不是数据库中的字段,而是我要编写的文本值。

postgresql case
  • 1 个回答
  • 24 Views
Martin Hope
msklut
Asked: 2020-04-04 11:13:54 +0800 CST

MySQL CASE 语句中的“LIKE”条件冲突

  • 1

我有两个条件导致 CASE 语句无法按预期工作。我试过改变哪个条件先出现,但它仍然只处理其中一个条件。有什么建议么?

仅返回第一个 '(' 之前的值并将所有 'Metallic' 实例替换为 'M' 的 CASE 语句:

CASE
WHEN `order_option`.`value` LIKE '%(%)%' THEN SUBSTRING_INDEX(`order_option`.`value`,' (', 1)
WHEN `order_option`.`value` LIKE '%Metallic%' THEN REPLACE (`order_option`.`value`,'Metallic','M')
ELSE `order_option`.`value`
END AS `Option`,

当前数据

`value`
--------
Red Metallic (999)
Blue (745)

预期成绩

`Option`
--------
Red M
Blue

先感谢您!

mysql case
  • 1 个回答
  • 41 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve