我在存储过程中创建了一个名为@AccountStatRollup的表。我用帐户填充了它。我创建了一个名为@Contacts的表。我用ContactID和ContactAccountids填充了它。我正在尝试填充 @coundutstatrollup.accountcontacts字段,其中@Contacts表的总共相关联系人。
我尝试了一个数字,如果SQL Update语句失败。这是我尝试的最后一句话:
感谢您的任何帮助。
凯文
Declare @AccountStatRollup TABLE(
AccountID varchar(30),
AccountContacts int
)
Declare @Contacts TABLE(
ContactID varchar(30),
ContactsAccountID varchar(30)
)
我试图计算帐户联系人计数
UPDATE @AccountStatRollup a
SET a.AccountContacts = (SELECT COUNT(*)FROM @Contacts c GROUP BY c.ContactsAccountID)
ON c.ContactsAccountID = a.ContactID
谢谢大家!我设法获得了此代码来保存和执行(Microsoft SQL Server)
--Calculate Account Contacts count
UPDATE @AccountStatRollup
SET AccountContacts = (SELECT COUNT(*) FROM @Contacts
WHERE ContactsAccountID = AccountID )
我让存储的程序运行了一段时间,然后我杀死了它。我意识到,这必须是我计算的一种非常低效的方式。我将使用此示例添加其他列总计。我可能有30,000个帐户和16,000个联系...
我试图使此代码正常工作,但没有识别C.Contactsaccountid,无法解决。
--Calculate Account Contacts count ver 2
UPDATE a
SET AccountContacts = c.cnt
FROM @AccountStatRollup a join
(SELECT COUNT(*) as cnt
FROM @Contacts c
GROUP BY c.ContactsAccountID
) c
ON c.ContactsAccountID = a.AccountID;
msg 207,第16级,状态1,过程帐户statrollup,第56行无效列名称" ContactSaccountid"。
是否有比我尝试过的更有效的计算总数?
谢谢!
凯文
好吧,我想出了如何使此工作快速工作。
我用独特的索引创建了我的温度表。
- 创建一个本地表来保存帐户统计 声明@AccountStatRollup表( AccountId varchar(18), 帐户contacts int, 唯一(accountId) );
- 创建一个本地表来保存联系数据 声明@contacts表( ContactID Varchar(18), Contactsacccountid Varchar(18), 唯一(ContactID) );
- 创建一个本地表来保存联系人计算数据 声明@TMPACCOUNTCALCALCULUTION表( AccountId varchar(18), accountName varchar(100), fieldCount int, 唯一(accountId) );
- 带有所有accountID值的填充@AccountStatRollup表
插入@AccountStatRollup(accountID) 从SFACCOUNT中选择ID - 带有所有accountID值的填充@Contacts表
插入@Contacts(ContactID,ContactSaccountid) 从SFContact中选择ID,accountID
- 填充@TMPACCOUNTCALCALUTION表 插入@TMPACCOUNTCOUNTCALCALUTION(AccountID,AccountName,FieldCount) 选择dbo.sfaccount.id,dbo.sfaccount.name,count(dbo.sfcontact.accountid)作为ContactCount 从dbo.sfaccount in dbo.sfaccount.id = dbo.sfcont.dbo.sfcontact = dbo.sfcontact.acconcountid dbo.sfaccount.id的组,dbo.sfaccount.name hamave(count(dbo.sfcontact.accountid)> 0)
- 更新@accountstatrollup表 更新 设置A.AccountContacts = B.FieldCount 来自@AccountStatRollup a 内在加入@tmpaccountcountcalcalulation b on a.accountid = b.accountid
- 测试输出从@accountstatrollup中选择 * accountContacts> 0订单counderContacts desc
这需要大约1秒钟才能运行。
whew ....
凯文
您应该将其中的条件移至内部查询,而您不需要组来:
UPDATE @AccountStatRollup a
SET
a.AccountContacts = (
SELECT
COUNT(*)
FROM
@Contacts c
where
c.ContactsAccountID = a.ContactID
);
因为您正在使用表变量,所以我假设这是SQL Server。您可以使用join
使用CC_2语法以一种漂亮的方式进行更新:
UPDATE a
SET AccountContacts = c.cnt
FROM @AccountStatRollup a join
(SELECT COUNT(*) as cnt
FROM @Contacts c
GROUP BY c.ContactsAccountID
) c
ON c.ContactsAccountID = a.ContactID;
SQL标准方法几乎应该在所有数据库中使用,是使用相关子查询:
UPDATE @AccountStatRollup a
SET AccountContacts = (SELECT COUNT(*)
FROM @Contacts c
WHERE c.ContactsAccountID = a.ContactID
);
使用相关的子查询时,不需要group by
。实际上,包括group by
包括误导性,因为它表明可能有多个组 - 这会在执行语句时会导致错误。