根据"Select count(*) Group By"填充列



我在存储过程中创建了一个名为@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包括误导性,因为它表明可能有多个组 - 这会在执行语句时会导致错误。

最新更新