更新 SQL Server 中 GROUP BY sum() 函数的查询问题 [关闭]

Posted

技术标签:

【中文标题】更新 SQL Server 中 GROUP BY sum() 函数的查询问题 [关闭]【英文标题】:Update query issue of GROUP BY sum() function in SQL Server [closed] 【发布时间】:2020-02-13 15:24:05 【问题描述】:
SELECT p.userId, u.username, SUM(p.prices)Price 
FROM tblPrices p, tblUsers u 
WHERE u.userId = p.userId
GROUP BY p.userId, u.username

我想在结果中更新Price

【问题讨论】:

不清楚你在问什么。您想更新 tblPrices.prices 吗?您尝试了哪些方法,又是如何失败的? 请不要使用隐式连接。近 30 年来,显式连接一直是标准 SQL 的一部分,是时候接受它们了! 执行后将创建表,我想在此表结果中更新价格 目前,该查询将为每个用户 ID 和用户名生成总价。那应该存放在哪里?如果 id 1,名字 Mo,有两个价格,13 和 7,你会得到 20 的结果。但是现在呢?当然,您不想用 20 更新价格表的每一行,因为这不是真的。 【参考方案1】:

https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=cb7049e35720e92e5bee4a678b5283d3

在 SQL Server 中,您有两种创建表的途径。显式 CREATE TABLE 语句,您在其中显式定义表结构。另一个通过 SELECT 语句的可选INTO 子句进行管理。 SQL 引擎将识别结果集的形状,然后创建一个与您的结果完全匹配的表。 这也将立即将查询的任何结果加载到表中,但这只能工作一次。如果您需要向表中添加更多数据,则必须将查询重写为传统的INSERT 语句,并且可能根据源数据的可变性重写为UPDATE。另一种方法是删除表并每次重新创建它。正确的选择取决于业务需求和数据适用性。

模拟你的环境

CREATE TABLE dbo.tblPrices
(
userId int NOT NULL
, prices decimal(18,2) NOT NULL
);

create table dbo.tblUsers
(
userId int NOT NULL
,username varchar(50) nOT NULL
);

insert into
dbo.tblUsers 
VALUES (1,'mo')
,(2, 'bill')
,(3, 'no sales');

insert into dbo.tblPrices
VALUES
(1, 13)
,(1, 7)
, (2, 17);

查询数据

-- create the table if it doesn't exist
-- blows up otherwise
SELECT
    P.userId
,   U.username
,   SUM(P.prices) AS Prices
INTO
    dbo.RESULTS
FROM
    dbo.tblPrices AS P
    INNER JOIN
        dbo.tblUsers AS U
        ON U.userId = P.userId
GROUP BY
    P.userId
,   U.username

;

-- What if we want to see all users, whether they had sales or not
-- Notice the change to a left join as well as reordering of the
-- tables and the use of the users userId as the prices might not exist
SELECT
    U.userId
,   U.username
,   SUM(P.prices) AS Prices
INTO
    dbo.RESULTS_ALL_USERS
FROM
    dbo.tblUsers AS U
    LEFT OUTER JOIN
        dbo.tblPrices aS P
        ON U.userId = P.userId
GROUP BY
    U.userId
,   U.username
;

检查结果

SELECT * FROM dbo.RESULTS AS R ORDER BY userID;
SELECT * FROM dbo.RESULTS_ALL_USERS AS R ORDER BY userID;

【讨论】:

我要更新Prices 但是您的comment 指定了After execute this Will be Create table , I want Update Price in This Table Result 您意识到如果更新 tblPrices 中的值,数据不再反映现实,对吧? Picture 可能会更清楚我认为您要的是什么以及为什么这可能是一个坏主意。您将失去所有原始定价值,更糟糕的是,如果有人查看其中的总计,他们会看到夸大的价值 SELECT r.SuplierId ,s.SuplierName,SUM(CONVERT(float,r.Rest)) Dept FROM tblRequest r, tblSuplier s Where s.SuplierId = r.SuplierId GROUP BY r.SuplierId,S.SuplierName **执行后我想把结果放到表中并更新Dept【参考方案2】:

假设每个用户 ID 都有一个对应的用户名,您可以使用带有 JOIN 的 UPDATE 语句来替换价格值:

UPDATE A
SET A.Prices=B.Price_Sum
FROM tblPrices A 
INNER JOIN 
    (Select userId,SUM(prices) as Price_Sum
    from tblPrices 
    GROUP BY userId) B
ON A.UserID=B.UserID

这会将价格字段替换为该用户所有价格的总和。希望这会有所帮助。

编辑:正如 Billinkc 在 cmets 中提到的,这将用总和替换所有单个价格。仅当您确定这是您想要的时才使用此查询。另外,请注意更新语句只能运行一次。如果多次运行,你会得到错误的结果。

【讨论】:

如果我有两个价格,一个 7 和一个 13,我的总数是 20。运行您的查询后,我的总数变为 40。这可能不是他们想要的,即使它被问。可能会在“这会破坏您的原始数据,确保这确实是您的意图”$.02 我同意这可能不是预期的结果。我会在我的答案中添加警告。但是我不明白这个值是怎么变成 40 的。你的意思是如果它运行了两次? SELECT r.SuplierId ,s.SuplierName,SUM(CONVERT(float,r.Rest)) Dept FROM tblRequest r, tblSuplier s Where s.SuplierId = r.SuplierId GROUP BY r.SuplierId,S.SuplierName 我想要UPDATE Dept

以上是关于更新 SQL Server 中 GROUP BY sum() 函数的查询问题 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver2008,sql编程,group by 用法

sqlserver2008,sql编程,group by 用法

SQL Server: Difference between PARTITION BY and GROUP BY

在 SQL Server 中使用 group by 的列名总和?

GROUP BY 中的 SQL Server 2014 LAST_VALUE

SQL server 关于 GROUP BY 详细讲解和用法