我正在使用以下查询来获取过滤器中所有行的字段数量的总和:
SELECT SUM(Amount)
FROM dbo.[CompanyName$Detailed Cust_ Ledg_ Entry]
WHERE [Customer No_] = 'XYZ'
Run Code Online (Sandbox Code Playgroud)
结果是
这个结果不等于行的总和
SELECT [Customer No_], Amount
FROM dbo.[CompanyName$Detailed Cust_ Ledg_ Entry]
WHERE [Customer No_] = 'XYZ'
Run Code Online (Sandbox Code Playgroud)
行的结果是:
计算行的等位基因数量时,结果为:-29,59 而不是 -59,18
有人可以解释这种行为吗?
XML 查询计划
<?xml version="1.0" encoding="utf-16"?>
<ShowPlanXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="1.481" Build="14.0.3045.24" xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan">
<BatchSequence>
<Batch>
<Statements>
<StmtSimple StatementCompId="1" StatementEstRows="9.00002" StatementId="2" StatementOptmLevel="FULL" StatementOptmEarlyAbortReason="GoodEnoughPlanFound" CardinalityEstimationModelVersion="140" StatementSubTreeCost="0.029753" StatementText="SELECT 'XYZ' [Customer No_],[Amount] FROM [dbo].[CompanyName$Detailed Cust_ Ledg_ Entry] WHERE [Customer No_]=@1" StatementType="SELECT" QueryHash="0x97A8CCC9F15EC998" QueryPlanHash="0x7502550BCACA55B0" RetrievedFromCache="false" SecurityPolicyApplied="false">
<StatementSetOptions …
Run Code Online (Sandbox Code Playgroud) 如何使用 Sum 和 Count 函数连接多个表进行聚合?
我正在尝试的查询如下:
Select
campaigns.id,
campaigns.name,
Count(landers.campaign_id) As landers_count,
Sum(conversions.revenue) As total_revenue
From
campaigns Left Join
conversions
On campaigns.id = conversions.campaign_id Left Join
landers
On campaigns.id = landers.campaign_id
Group By
campaigns.id
Run Code Online (Sandbox Code Playgroud)
我什至尝试过外部连接,但没有运气,而且我得到的结果不准确。
我的示例表如下:
活动表:
| id | name |
+----+----------------+
| 1 | Facebook Ads |
| 2 | Bing Ads |
| 3 | Direct Mailing |
| 4 | Solo Ads |
Run Code Online (Sandbox Code Playgroud)
兰德斯表:
| id | name | campaign_id |
+----+-------------+-------------+
| 1 | Lander …
Run Code Online (Sandbox Code Playgroud) 在我们的应用程序中,我们有一个查询,它在 API 端点上将具有“活动”的用户返回给指定的客户端或事件(一个或多个 - 由 ID 指定)。当活动表有 3000 万行时,这个查询大约需要 15 秒才能返回(注意“资产”表中还有约 60 万行和 2700 个“用户”)。
表格的粗略架构可以在我的问题的底部找到。下面是我们查找“活动超过阈值的用户”的查询。为简洁起见,我也在下面放置了视图定义。
当此端点返回一页数据时,还会运行第二个类似的查询以获取填充分页响应的元素总数 - 本质上,端点的性能是查询性能的 2 倍。
我的问题本质上是,我应该应用哪些技术来提高此查询的性能?我们试图坚持的“基准”是端点响应的“亚秒级”。
查询计划可以在这里找到。
SELECT DISTINCT t.type, t.sid, t.name, t.emailAddress, t.jobTitle
FROM sec.Trustee t
INNER JOIN (
SELECT data.sid, SUM(data.hoursBilled) as hoursBilled, SUM(data.docsAccessed) as docsAccessed, data.asset_type as asset_type, data.displayId as displayId, data.displayName as displayName
FROM (
SELECT billing.trustee_sid as sid, 0 as hoursBilled, billing.recordedValue as docsAccessed, a.type as asset_type, a.displayId, a.displayName
FROM sec._DocumentsBilling billing
INNER JOIN sec.SessionSid s
ON …
Run Code Online (Sandbox Code Playgroud) 我有下表:
NAME
Alex
Bob
Bob
Tim
Alex
Roger
Run Code Online (Sandbox Code Playgroud)
我需要生产以下内容:
Name Count Percentage
Alex 2 33%
Bob 2 33%
Roger 1 16.6%
Tim 1 16.6%
Run Code Online (Sandbox Code Playgroud)
我不知道从哪里开始。我可以对计数进行初始查询,这很简单。
我有一个这样的表:
CREATE TABLE Table1
(ID int, empid int, time datetime, state int);
+--------------+---------------------+-----------------+
| empid | time | state |
+--------------+---------------------+-----------------+
( 4 | 2014-03-01 11:12:00 | 0 )
( 5 | 2014-03-01 12:28:06 | 0 )
( 4 | 2014-03-01 12:50:07 | 1 )
( 4 | 2014-03-01 13:38:00 | 0 )
( 5 | 2014-03-01 13:28:06 | 1 )
( 4 | 2014-03-01 18:42:15 | 1 )
( 4 | 2014-03-02 08:11:08 | 0 )
( 4 | …
Run Code Online (Sandbox Code Playgroud) 我跑了咆哮查询;
询问:
SELECT j.jobId,
j.productId,
p.productUnitPrice
FROM JobRequiredProducts J
JOIN Product p
ON p.productId = j.productId
WHERE j.jobId = 1
ORDER BY j.jobId
Run Code Online (Sandbox Code Playgroud)
并得到了以下结果;
查询结果:
jobId | productId | unitPrice
_____________________________
1 | 4 | 175.99
1 | 5 | 100.00
1 | 6 | 125.00
Run Code Online (Sandbox Code Playgroud)
现在,我想计算所有 unitPrice 以获得总数。我期望的结果是;
期待结果:
jobId | productId | Total
____________________________
1 | 4 | 175.99
1 | 5 | 100.00
1 | 6 | 125.00
null | null | 400.99
Run Code Online (Sandbox Code Playgroud)
因此,下面是我尝试过的查询;
我试过的查询:
SELECT j.jobId, …
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 表达式具有所需数量的条件/值对,从而使您能够通过聚合对值进行高度特定的截取。您还可以使用此技巧来模拟交叉表和数据透视表,将聚合表示为单独的列而不是行。一个常见的示例是进行当年/上一年分析,因为您可以使用不同的列来表示不同的年份。
作为新手,该技术似乎对于总结数据非常有用。我想在线查找该技术以获取更多信息。
该书的作者将该技术称为“零/空案例技巧”。但当我用谷歌搜索这个词时,我没有得到很多结果。
问题:
该技术有一个普遍接受的名称吗?(在线搜索时会产生更多结果)
我有2张桌子
ID | 指定 |
---|---|
1 | 古柯 |
2 | 百事可乐 |
3 | 芬达 |
4 | 七 |
5 | 八 |
2)子产品
产品编号 | 姓名 | 数量 |
---|---|---|
1 | SM | 10 |
1 | lg | 10 |
1 | XL | 20 |
2 | 1升 | 10 |
2 | 2升 | 20 |
2 | 5升 | 20 |
3 | 泰 | 10 |
3 | 萨 | 20 |
4 | 哈 | 20 |
4 | 克德 | 30 |
我想要的是这样的:产品表中的指定和总数量,代表具有相同product_id的数量的总和
指定 | 总数(量 |
---|---|
古柯 | 40 |
百事可乐 | 50 |
芬达 | 30 |
七 | 50 |
注:我使用 SQL 服务器
我一直在计算包含大约 500.000 条双精度数字记录的列的总和。数据库中的所有数字通常应该是句点后面的两个密码。但是,在计算总和后,我得到了 6 个数字:123123123.549977
要么我的数据库中有错误的数据,其中在句点之后有更多数字的记录,要么我遗漏了 sum 函数。
所以我的问题是:
我有一个学生表和一个不同科目的分数表。我想将所有科目的每个学生的 score1 和 score2 相加,然后为每个学生加上奖金。
CREATE TABLE student (
id serial PRIMARY KEY,
name text NOT NULL,
bonus integer NOT NULL,
);
CREATE TABLE score (
id serial PRIMARY KEY,
subject text NOT NULL,
score1 integer NOT NULL,
score2 integer NOT NULL,
student_id integer NOT NULL,
CONSTRAINT s_id FOREIGN KEY (student_id) REFERENCES student (id),
);
Run Code Online (Sandbox Code Playgroud)
连接 score1 和 score2 的查询如下所示:
SELECT st.name, sum(sc.score1 + sc.score2) as total
FROM student st
LEFT JOIN score sc ON sc.student_id = st.id
group by …
Run Code Online (Sandbox Code Playgroud) 我被困在如何对一列求和的方式上,让我们说表的第一列(来自另一个查询的结果)而不知道列名和列位置 id 之类的东西。
是这样的
select sum(what?), employID from
( select count(*), employID from table1...
union all
select count(*), employID from table2...
union all
select count(*), employID from table3...
)
Run Code Online (Sandbox Code Playgroud)
或者,如果它在单个查询中(使用 sum() 的单个简单选择查询),例如:
select employName, sum(what?), employID from tableX
Run Code Online (Sandbox Code Playgroud)
我如何告诉 SUM() 函数根据表中的列位置索引求和SUM(2)
?
注意:我不想使用列别名,是否有可能不基于列名进行 SUM?
我知道我可以使用列名或别名,但我真的想知道不只使用这些的可能性,这就是我问这个问题的原因,如果没有可能的方法,那么我会接受“否”作为正确答案。
sum ×11
aggregate ×4
sql-server ×4
join ×3
postgresql ×3
count ×2
mysql ×2
oracle ×2
query ×2
case ×1
group-by ×1
oracle-19c ×1
terminology ×1