Sql server 2008 基于求和的同一表内SQL更新
我有一个名为t的表,如下所示Sql server 2008 基于求和的同一表内SQL更新,sql-server-2008,group-by,sql-update,sum,duplicates,Sql Server 2008,Group By,Sql Update,Sum,Duplicates,我有一个名为t的表,如下所示 cust_id| brand| bill_amt| AA| BB| 1234 | AA| 100| NULL| NULL| 5678 | AA| 300| NULL| NULL| 5678 | BB| 350| NULL| NULL| 5678 |
cust_id| brand| bill_amt| AA| BB|
1234 | AA| 100| NULL| NULL|
5678 | AA| 300| NULL| NULL|
5678 | BB| 350| NULL| NULL|
5678 | BB| 600| NULL| NULL|
我的数据中大约有数十万条记录,我是否可以按如下所示更新t表? cust_id| brand| bill_amt| AA| BB|
1234 | AA| 100| 100| NULL|
5678 | AA| 300| 300| 950|
5678 | BB| 350| 300| 950|
5678 | BB| 600| 300| 950|
如何在AA和BB列下显示账单金额值?我如何总结同一客户在品牌上花费的账单金额
例如,查看客户5678,她在不同的日子为品牌BB花费了350美元和600美元,我如何在BB栏中显示她为BB花费的账单金额的总和
另外,同一位客户在AA上花费了300美元,我如何在AA栏中显示该值 要选择摘要而不在表中实际创建摘要字段,只需在上使用
;将此创建为视图很可能会在不更改表的情况下提供相同的优势
SELECT CUST_ID, BRAND, BILL_AMT,
SUM(CASE WHEN brand='AA' THEN bill_amt ELSE NULL END)
OVER (PARTITION BY cust_id) AA,
SUM(CASE WHEN brand='BB' THEN bill_amt ELSE NULL END)
OVER (PARTITION BY cust_id) BB
FROM t;
为了实际更新表,您可以使用一个通用的表表达式,但是我真诚地建议您不要这样做,除非历史数据永远不会更改,因为对数据的更改将不再自动更新摘要
WITH cte AS (
SELECT *,
SUM(CASE WHEN brand='AA' THEN bill_amt ELSE NULL END)
OVER (PARTITION BY cust_id) AA2,
SUM(CASE WHEN brand='BB' THEN bill_amt ELSE NULL END)
OVER (PARTITION BY cust_id) BB2
FROM t
)
UPDATE cte SET AA=AA2, BB=BB2;
.要选择摘要而不在表中实际创建摘要字段,您只需在
上使用;将此创建为视图很可能会在不更改表的情况下提供相同的优势
SELECT CUST_ID, BRAND, BILL_AMT,
SUM(CASE WHEN brand='AA' THEN bill_amt ELSE NULL END)
OVER (PARTITION BY cust_id) AA,
SUM(CASE WHEN brand='BB' THEN bill_amt ELSE NULL END)
OVER (PARTITION BY cust_id) BB
FROM t;
为了实际更新表,您可以使用一个通用的表表达式,但是我真诚地建议您不要这样做,除非历史数据永远不会更改,因为对数据的更改将不再自动更新摘要
WITH cte AS (
SELECT *,
SUM(CASE WHEN brand='AA' THEN bill_amt ELSE NULL END)
OVER (PARTITION BY cust_id) AA2,
SUM(CASE WHEN brand='BB' THEN bill_amt ELSE NULL END)
OVER (PARTITION BY cust_id) BB2
FROM t
)
UPDATE cte SET AA=AA2, BB=BB2;
.要选择摘要而不在表中实际创建摘要字段,您只需在
上使用;将此创建为视图很可能会在不更改表的情况下提供相同的优势
SELECT CUST_ID, BRAND, BILL_AMT,
SUM(CASE WHEN brand='AA' THEN bill_amt ELSE NULL END)
OVER (PARTITION BY cust_id) AA,
SUM(CASE WHEN brand='BB' THEN bill_amt ELSE NULL END)
OVER (PARTITION BY cust_id) BB
FROM t;
为了实际更新表,您可以使用一个通用的表表达式,但是我真诚地建议您不要这样做,除非历史数据永远不会更改,因为对数据的更改将不再自动更新摘要
WITH cte AS (
SELECT *,
SUM(CASE WHEN brand='AA' THEN bill_amt ELSE NULL END)
OVER (PARTITION BY cust_id) AA2,
SUM(CASE WHEN brand='BB' THEN bill_amt ELSE NULL END)
OVER (PARTITION BY cust_id) BB2
FROM t
)
UPDATE cte SET AA=AA2, BB=BB2;
.要选择摘要而不在表中实际创建摘要字段,您只需在
上使用;将此创建为视图很可能会在不更改表的情况下提供相同的优势
SELECT CUST_ID, BRAND, BILL_AMT,
SUM(CASE WHEN brand='AA' THEN bill_amt ELSE NULL END)
OVER (PARTITION BY cust_id) AA,
SUM(CASE WHEN brand='BB' THEN bill_amt ELSE NULL END)
OVER (PARTITION BY cust_id) BB
FROM t;
为了实际更新表,您可以使用一个通用的表表达式,但是我真诚地建议您不要这样做,除非历史数据永远不会更改,因为对数据的更改将不再自动更新摘要
WITH cte AS (
SELECT *,
SUM(CASE WHEN brand='AA' THEN bill_amt ELSE NULL END)
OVER (PARTITION BY cust_id) AA2,
SUM(CASE WHEN brand='BB' THEN bill_amt ELSE NULL END)
OVER (PARTITION BY cust_id) BB2
FROM t
)
UPDATE cte SET AA=AA2, BB=BB2;
您是否考虑过使用嵌套查询来汇总和更新指定的列?您只有两个品牌?我有超过2个品牌,但只是希望简化上面所示的表。问题是。你为什么会考虑这个?您的db模式似乎是错误的,因为在您应该努力避免重复的时候,您正在进行大量的数据冗余。当您可以在“运行时”计算合计金额时,为什么需要存储合计金额?这些合计金额(或总计)似乎不属于每个记录(行),因为您的记录代表一个金融交易,并且总计不是每个交易的属性。除了不这样做之外,没有办法简化它。您可以相对容易地将tehb运行总计作为轴心/交叉表,但将它们作为交叉表进行持久化是一个非常糟糕的主意。事实上,在维护底层数据的系统中持久化任何正在运行的总计充其量只是一个预兆。你无论如何都要重新计算所有的。你是否考虑过使用嵌套查询来总结和更新指定的列?你只有两个品牌?我有超过2个品牌,但是只希望简化上面所示的表格。问题是。你为什么会考虑这个?您的db模式似乎是错误的,因为在您应该努力避免重复的时候,您正在进行大量的数据冗余。当您可以在“运行时”计算合计金额时,为什么需要存储合计金额?这些合计金额(或总计)似乎不属于每个记录(行),因为您的记录代表一个金融交易,并且总计不是每个交易的属性。除了不这样做之外,没有办法简化它。您可以相对容易地将tehb运行总计作为轴心/交叉表,但将它们作为交叉表进行持久化是一个非常糟糕的主意。事实上,在维护底层数据的系统中持久化任何正在运行的总计充其量只是一个预兆。你无论如何都要重新计算所有的。你是否考虑过使用嵌套查询来总结和更新指定的列?你只有两个品牌?我有超过2个品牌,但是只希望简化上面所示的表格。问题是。你为什么会考虑这个?您的db模式似乎是错误的,因为在您应该努力避免重复的时候,您正在进行大量的数据冗余。当您可以在“运行时”计算合计金额时,为什么需要存储合计金额?这些合计金额(或总计)似乎不属于每个记录(行),因为您的记录代表一个金融交易,并且总计不是每个交易的属性。除了不这样做之外,没有办法简化它。您可以相对容易地将tehb运行总计作为轴心/交叉表,但将它们作为交叉表进行持久化是一个非常糟糕的主意。事实上,在维护底层数据的系统中持久化任何正在运行的总计充其量只是一个预兆。你无论如何都要重新计算所有的。你是否考虑过使用嵌套查询来总结和更新指定的列?你只有两个品牌?我有超过2个品牌,但是只希望简化上面所示的表格。问题是。你为什么会考虑这个?您的db模式似乎是错误的,因为在您应该努力避免重复的时候,您正在进行大量的数据冗余。