проблема с использованием агрегатных функций с объединениями - PullRequest
0 голосов
/ 23 августа 2011

У меня есть две таблицы Скажи Таблица -A и таблица-B

Таблица А, имеющая

   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 как DAte, Total, Sts as X, Sts as y, Avg of

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 ]

2 голосов
/ 23 августа 2011
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 в списке полей вместо Date или, возможно, RegDate as Date.
  2. Вы пропустили итоговый столбец,Вы можете сделать это с помощью count(*) as Total
  3. Ваши операторы select case ... должны быть не отборными, а sum(case ...)
  4. Total/2, откуда берется Total?Я предполагаю, что вы хотите получить среднее значение StsX и StsY, но это также может означать, что вы хотите использовать вычисленный столбец Total и разделить его на 2. Если это так, вам нужно повторить свой агрегатный операторcount(*)/2 или вы можете использовать весь этот запрос как подзапрос и выполнить вычисление, используя поле Total, как вы уже это сделали, Total/2.
  5. Ваши имена таблиц должны быть заключены в скобки [Table-B].
  6. У вас есть дополнительные b перед предложением group by.Вы должны удалить это.

`

1 голос
/ 23 августа 2011

вы можете попробовать:

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] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...