雪花 SQL 根据匹配值从另一个 Table 计数和求和
Snowflake SQL Counting and Summing from Another Table based on Matching Value
我正在尝试在 snowflake 中执行 SQL 查询,以根据第一个 table 的值计算来自不同 table 的值。例如,我在 table1 和 table2 中找到一个匹配的值,然后我从 table 2.
中计算匹配它的行数
当我尝试执行此操作时,查询 运行s 但结果数据计数不正确。它看起来好像在进行某种奇怪的 breakout/cumulative 计数。
我已经尝试阅读示例并在谷歌上搜索这样的示例,但有趣的是在非雪花 SQL 中,我看到的示例不需要 "group by" 我正在尝试 select。
在 snowflake 中,除非我将 (select count() 来自...
但是这样做似乎 return 结果比 counting/summing 值大很多,当我删除那个 (select count()... 行和group by,它正确地完成了所有其他事情,所以我猜那里有一些特别错误的地方。
select
"naming_db"."public"."username".name as "Name",
"naming_db"."public"."addresses".address as "Address",
count(*) as "Shoe Count",
(select count(*) from "data_db"."records"."orderID" where
"data_db"."records"."orderID".ID = "data_db"."records"."userinfo".ID) as "Orders",
sum("data_db"."records"."userinfo".revenue) as "Spend"
from "data_db"."records"."userinfo"
join "naming_db"."public"."username" on "naming_db"."public"."username".name = "data_db"."records"."userinfo".nameid
join "naming_db"."public"."addresses" on "naming_db"."public"."addresses".address = "data_db"."records"."userinfo".addressid
full join "data_db"."records"."orderID" on "data_db"."records"."userinfo".ID = "data_db"."records"."orderID".ID
group by 1,2,4
我认为 (select count(*) from... 行是问题所在,但我似乎无法弄清楚如何以一种可以进行查询的方式编写它 运行 和 return 我想要的结果。
刚刚编辑了查询以使其更有意义。试图混淆那里的一些信息,但我意识到它太混乱了抱歉!
这是我想要的结果。当我删除 "Orders" 行时我得到了这个 - 那是 (select count(*) from...
Correct but missing Orders
这是我在 "Orders" 的行中添加时得到的结果:
Incorrect summing and breaks out more rows
您可以在 column
鞋子上使用 sum()
而不是 subquery
。
select
"table1".name as "Name",
"table1".address as "Address",
count(*) as "Counts",
sum(case when coalesce("table3".shoeID, 0) != 0 then 1 else 0 end) as "Shoes",
sum("table2".shoecount) as "Number of Shoes"
from "table2"
join "table1" on "table1".name = "table2".name
join "table1" on "table1".Address = "table2".Address
full join "table3" on "table3".shoeID = "table2".shoeID
group by 1,2,4
重新排列查询后,您似乎拥有:
userinfo
是 User table,每个用户一行,每个用户的累计收入金额
orderID
是 订单 table 每个客户每个产品的数量
username
和addresses
仅用于显示用户联系信息(不重要)。
仍然很难理解你的聚合应该显示什么,所以我试着猜测:
- 鞋子数量 在您修改后的查询中出乎意料。它计算每个用户的累积行数,即现在的订单行数。鞋子数据以前在查询中,但你删除了它,所以 Shoe Count 现在没有意义了。
- Orders 很可能是每个用户的订单总数,也是该用户订单中的行数 table。但是 Shoe Count 没有区别,这让我想知道为什么。
- 支出 是每个用户的收入。
FULL JOIN
的使用令人困惑。它表示某些订单是针对非注册用户的 - userinfo
table 中不存在。这对我来说没有意义。您的示例表明所有订单都来自 userinfo
中的用户,因此不需要 FULL JOIN
.
为什么需要它?
解决方案应该非常简单。如果我不明白您的要求,请告诉我:
SELECT
ANY_VALUE(n.name) AS "Name",
ANY_VALUE(a.address) AS "Address",
COUNT(*) AS "Shoe Count",
COUNT(o.ID) AS "Orders",
ANY_VALUE(u.revenue) AS "Spend"
FROM "data_db"."records"."userinfo" u
INNER JOIN "naming_db"."public"."username" n ON n.name = u.nameid
INNER JOIN "naming_db"."public"."addresses" a ON a.address = u.addressid
INNER JOIN "data_db"."records"."orderID" o ON o.ID = u.ID
GROUP BY u.ID
您的子查询select 是一个相关的子查询,snow 对其的支持有限。因此,如果您转向计算所有 ID
的 CTE,然后加入它,您应该得到您想要的东西..
WITH order_counts AS (
SELECT ID, count(*) as count data_db.records.orderID group by 1
)
select
un.name as Name,
a.address as Address,
count(*) as Shoe Count,
oc.count as Orders,
sum(ui.revenue) as Spend
from data_db.records.userinfo as ui
join naming_db.public.username as un
on un.name = ui.nameid
join naming_db.public.addresses as a
on a.address = ui.addressid
left join order_counts as oc
on ui.ID = oc.ID
group by 1,2,4
我还插入了一些别名,因此 SQL 更具可读性。
我正在尝试在 snowflake 中执行 SQL 查询,以根据第一个 table 的值计算来自不同 table 的值。例如,我在 table1 和 table2 中找到一个匹配的值,然后我从 table 2.
中计算匹配它的行数当我尝试执行此操作时,查询 运行s 但结果数据计数不正确。它看起来好像在进行某种奇怪的 breakout/cumulative 计数。 我已经尝试阅读示例并在谷歌上搜索这样的示例,但有趣的是在非雪花 SQL 中,我看到的示例不需要 "group by" 我正在尝试 select。
在 snowflake 中,除非我将 (select count() 来自... 但是这样做似乎 return 结果比 counting/summing 值大很多,当我删除那个 (select count()... 行和group by,它正确地完成了所有其他事情,所以我猜那里有一些特别错误的地方。
select
"naming_db"."public"."username".name as "Name",
"naming_db"."public"."addresses".address as "Address",
count(*) as "Shoe Count",
(select count(*) from "data_db"."records"."orderID" where
"data_db"."records"."orderID".ID = "data_db"."records"."userinfo".ID) as "Orders",
sum("data_db"."records"."userinfo".revenue) as "Spend"
from "data_db"."records"."userinfo"
join "naming_db"."public"."username" on "naming_db"."public"."username".name = "data_db"."records"."userinfo".nameid
join "naming_db"."public"."addresses" on "naming_db"."public"."addresses".address = "data_db"."records"."userinfo".addressid
full join "data_db"."records"."orderID" on "data_db"."records"."userinfo".ID = "data_db"."records"."orderID".ID
group by 1,2,4
我认为 (select count(*) from... 行是问题所在,但我似乎无法弄清楚如何以一种可以进行查询的方式编写它 运行 和 return 我想要的结果。
刚刚编辑了查询以使其更有意义。试图混淆那里的一些信息,但我意识到它太混乱了抱歉!
这是我想要的结果。当我删除 "Orders" 行时我得到了这个 - 那是 (select count(*) from...
Correct but missing Orders
这是我在 "Orders" 的行中添加时得到的结果: Incorrect summing and breaks out more rows
您可以在 column
鞋子上使用 sum()
而不是 subquery
。
select
"table1".name as "Name",
"table1".address as "Address",
count(*) as "Counts",
sum(case when coalesce("table3".shoeID, 0) != 0 then 1 else 0 end) as "Shoes",
sum("table2".shoecount) as "Number of Shoes"
from "table2"
join "table1" on "table1".name = "table2".name
join "table1" on "table1".Address = "table2".Address
full join "table3" on "table3".shoeID = "table2".shoeID
group by 1,2,4
重新排列查询后,您似乎拥有:
userinfo
是 User table,每个用户一行,每个用户的累计收入金额orderID
是 订单 table 每个客户每个产品的数量username
和addresses
仅用于显示用户联系信息(不重要)。
仍然很难理解你的聚合应该显示什么,所以我试着猜测:
- 鞋子数量 在您修改后的查询中出乎意料。它计算每个用户的累积行数,即现在的订单行数。鞋子数据以前在查询中,但你删除了它,所以 Shoe Count 现在没有意义了。
- Orders 很可能是每个用户的订单总数,也是该用户订单中的行数 table。但是 Shoe Count 没有区别,这让我想知道为什么。
- 支出 是每个用户的收入。
FULL JOIN
的使用令人困惑。它表示某些订单是针对非注册用户的 - userinfo
table 中不存在。这对我来说没有意义。您的示例表明所有订单都来自 userinfo
中的用户,因此不需要 FULL JOIN
.
为什么需要它?
解决方案应该非常简单。如果我不明白您的要求,请告诉我:
SELECT
ANY_VALUE(n.name) AS "Name",
ANY_VALUE(a.address) AS "Address",
COUNT(*) AS "Shoe Count",
COUNT(o.ID) AS "Orders",
ANY_VALUE(u.revenue) AS "Spend"
FROM "data_db"."records"."userinfo" u
INNER JOIN "naming_db"."public"."username" n ON n.name = u.nameid
INNER JOIN "naming_db"."public"."addresses" a ON a.address = u.addressid
INNER JOIN "data_db"."records"."orderID" o ON o.ID = u.ID
GROUP BY u.ID
您的子查询select 是一个相关的子查询,snow 对其的支持有限。因此,如果您转向计算所有 ID
的 CTE,然后加入它,您应该得到您想要的东西..
WITH order_counts AS (
SELECT ID, count(*) as count data_db.records.orderID group by 1
)
select
un.name as Name,
a.address as Address,
count(*) as Shoe Count,
oc.count as Orders,
sum(ui.revenue) as Spend
from data_db.records.userinfo as ui
join naming_db.public.username as un
on un.name = ui.nameid
join naming_db.public.addresses as a
on a.address = ui.addressid
left join order_counts as oc
on ui.ID = oc.ID
group by 1,2,4
我还插入了一些别名,因此 SQL 更具可读性。