使用带有连接的聚合函数的问题

时间:2011-08-23 11:20:04

标签: asp.net sql-server-2005

我有两个表Say-A和table-B

表-A

   Userid | Date
 | 
   101       |   15 Aug ,2011 
   102       |   15 Aug ,2011 
   103       |   16 Aug ,2011 
   104       |   16 Aug ,2011 
   105       |   17 Aug ,2011 

表-B

 Userid(f.k) |  sts 
   101       |   x 
   102       |   y
   101       |   z
   103       |   x
   101       |   y

必需的输出是

表-C 我希望表c输出为 DAte,Total,Sts为X,Sts为y,平均值为

Date | Total | Sts (if=x) |Sts (if=y) |Avg (Total/2) 

15 Aug| 20   |  15        |5          |10     
16aug | 30   |  22        |8          |15 

我尝试使用:

select Date, select case when [Tasble-B].Sts='x' Then 0 else 1 END as StsX,select case when [Tasble-B].Sts='Y' Then 0 else 1 END as StsY,Total/2
from
   Table-A
     inner join  Table-B on Table-A.UserID = Table-B.UserID          
     b group by RegDate 

我收到错误,我被这个查询困住了。请帮助 提前致谢

2 个答案:

答案 0 :(得分:2)

select Date, 
       select case when [Tasble-B].Sts='x' Then 0 
                   else 1 
              END as StsX,
       select case when [Tasble-B].Sts='Y' Then 0 
                   else 1 
              END as StsY,
       Total/2 
from Table-A 
  inner join Table-B 
    on Table-A.UserID = Table-B.UserID
b group by RegDate
  1. 您执行group by RegDate因此我认为您应该在字段列表中使用RegDate而不是DateRegDate as Date
  2. 您缺少总列数。您可以使用count(*) as Total
  3. 执行此操作
  4. 您的select case ...语句不应该是选择,而是sum(case ...)
  5. Total/2Total来自哪里?我的猜测是你想要StsXStsY的平均值,但它也可能意味着你想要使用计算出的Total列并将其除以2.如果是这样的话你就是需要重复您的汇总语句count(*)/2,或者您可以将整个查询用作子查询,并使用Total字段进行计算,Total/2
  6. 您的表名需要封装在方括号[Table-B]
  7. 您在b子句之前有一个额外的group by。你应该删除它。
  8. `

答案 1 :(得分:1)

你可以尝试:

select [Date], 
       (SUM(case when B.Sts='x' Then 1 
                   else 0 
              END) + 
       SUM( case when B.Sts='Y' Then 1 
                   else 0 
              END)) AS Total,
       SUM( case when B.Sts='x' Then 1 
                   else 0
              END) AS StsX,
       SUM( case when B.Sts='Y' Then 1 
                   else 0
              END) as StsY,
       (SUM(case when B.Sts='x' Then 1 
                   else 0 
              END) + 
       SUM( case when B.Sts='Y' Then 1 
                   else 0 
              END))
        /2.0 AS Average 
from A 
  inner join B 
    on A.UserID = B.UserID
group by [Date]  

我测试了它:

WITH A (UserId, [Date]) AS ( 
 SELECT 101, '2011-08-15'
 UNION
 SELECT 102, '2011-08-15'
 UNION
 SELECT 103, '2011-08-16'
 UNION
 SELECT 104, '2011-08-16'
 UNION
 SELECT 105, '2011-08-17'
 ),
 B (UserId, sts) AS 
 (
   SELECT 101, 'x'
   UNION 
   SELECT 102, 'y'
   UNION 
   SELECT 101, 'z'
   UNION 
   SELECT 103, 'x'
   UNION 
   SELECT 101, 'y'
)    
select [Date], 
       (SUM(case when B.Sts='x' Then 1 
                   else 0 
              END) + 
       SUM( case when B.Sts='Y' Then 1 
                   else 0 
              END)) AS Total,
       SUM( case when B.Sts='x' Then 1 
                   else 0
              END) AS StsX,
       SUM( case when B.Sts='Y' Then 1 
                   else 0
              END) as StsY,
       (SUM(case when B.Sts='x' Then 1 
                   else 0 
              END) + 
       SUM( case when B.Sts='Y' Then 1 
                   else 0 
              END))
        /2.0 AS Average 
from A 
  inner join B 
    on A.UserID = B.UserID
group by [Date]