【问题标题】:How to add a subquery to return count of related rows如何添加子查询以返回相关行的计数
【发布时间】:2013-11-16 02:55:56
【问题描述】:

我有一个有效的 SELECT,它返回每个公司(即订户)的信息。某些描述性数据是从“代码”表上的内部连接返回的。我的问题是如何在结果中添加一个新列,该列是属于每个订阅者的用户数的计数。用户表中的 SubscriberID 是外键:

ALTER TABLE dbo.UserInfo WITH CHECK ADD CONSTRAINT FK_UserInfo_SubscriberID 
  FOREIGN KEY(SubscriberID) REFERENCES dbo.Subscriber (SubscriberID)
  ON UPDATE CASCADE
  ON DELETE CASCADE

我在下面添加了 LEFT OUTER JOIN 和 GROUP BY,但我无法弄清楚为什么解析器会抱怨 U.SubscriberID 是无效的列名)。

SELECT SubscriberID
  ,SubscriberName
  ,DaysUntilExpired
  ,SubscriptionStatus SubscriptionStatusCode
  , C.Description  SubscriptionStatus
  ,U.NumberUsers
FROM dbo.Subscriber S 
    JOIN dbo.CodeValue C ON S.SubscriptionStatus = C.Value
    JOIN dbo.CodeNamespace N ON N.ID = C.CodeNamespaceID AND N.Name = 'SubscriptionStatus'
    JOIN dbo.CodeValue V ON S.NotificationStatus = V.Value
    JOIN dbo.CodeNamespace X ON X.ID = V.CodeNamespaceID AND X.Name = 'NotificationStatus'
LEFT OUTER JOIN (SELECT Count(*) AS NumberUsers FROM dbo.UserInfo) AS U  
ON S.SubscriberID = U.SubscriberID 
GROUP BY 
    S.SubscriberID
  ,SubscriberName
  ,DaysUntilExpired
  ,S.SubscriptionStatus
  ,SubscriptionStatus

【问题讨论】:

  • (SELECT SubscriberID, Count(*) AS NumberUsers FROM dbo.UserInfo GROUP BY SubscriberID) AS U.

标签: sql sql-server tsql


【解决方案1】:

您可能正在寻找以下内容。您需要内联子查询

SELECT SubscriberID
  ,SubscriberName
  ,DaysUntilExpired
  ,SubscriptionStatus SubscriptionStatusCode
  , C.Description  SubscriptionStatus
  ,(SELECT Count(*) AS NumberUsers FROM dbo.UserInfo where SubscriberID = S.SubscriberID) AS NumberUsers
FROM dbo.Subscriber S 
    JOIN dbo.CodeValue C ON S.SubscriptionStatus = C.Value
    JOIN dbo.CodeNamespace N ON N.ID = C.CodeNamespaceID AND N.Name = 'SubscriptionStatus'
    JOIN dbo.CodeValue V ON S.NotificationStatus = V.Value
    JOIN dbo.CodeNamespace X ON X.ID = V.CodeNamespaceID AND X.Name = 'NotificationStatus'
GROUP BY 
    S.SubscriberID
  ,SubscriberName
  ,DaysUntilExpired
  ,S.SubscriptionStatus
  ,SubscriptionStatus

【讨论】:

    【解决方案2】:

    Sql 抱怨是因为您的 LEFT OUTER JOIN 子查询在列列表中不包含 SubscriberId(并且在 group by 子句中,因为您有一个 COUNT 聚合),因此它无法在此列上进行连接。

    你应该这样做:

    LEFT OUTER JOIN (SELECT SubscriberID , Count(*) AS NumberUsers FROM dbo.UserInfo GROUP BY SubscriberID ) AS U  
    ON S.SubscriberID = U.SubscriberID 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-07
      • 2023-03-19
      • 2011-09-02
      • 1970-01-01
      相关资源
      最近更新 更多