Member 13400047 Ответов: 2

Не могли бы вы помочь решить эту инструкцию query case при выборе из одной и той же таблицы другого типа из одного столбца и сгруппировать по


Только одно выражение может быть указано в списке выбора, если подзапрос не введен с помощью EXISTS.

Что я уже пробовал:

select ( case TT when 'BTOS'
   then (SELECT DATEADD(WEEK,DATEDIFF(week,0,R_DATE),0)as Date,
         COUNT(*)as "OSCount" ,sum(amount) as "Gross OS",SUM(fee_amount) as "OS Fee",SUM(amount)-SUM(fee_amount) as "NetOS"
         from [TVDEV].[dbo].[TRN] group by DATEADD(WEEK,DATEDIFF(week,0,R_DATE),0) )
     when 'BTR' then 
     (SELECT DATEADD(WEEK,DATEDIFF(week,0,R_DATE),0)as Date, COUNT(*)as "RCount"
     ,SUM(amount)-SUM(fee_amount) as "R",NetOS-R as Deposit
      from [TVDEV].[dbo].[TRN]  group by DATEADD(WEEK,DATEDIFF(week,0,R_DATE),0))
     else null
     end) as TT
      
 from [TVDEV].[dbo].[TRN] where R_STATUS='R'

2 Ответов

Рейтинг:
0

OriginalGriff

Прочтите сообщение об ошибке:

Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.
Это довольно ясно.
Один или несколько ваших подзапросов возвращают более одного столбца. В частности, это:
case TT when 'BTOS'
then (SELECT DATEADD(WEEK,DATEDIFF(week,0,R_DATE),0)as Date,
COUNT(*)as "OSCount" ,sum(amount) as "Gross OS",SUM(fee_amount) as "OS Fee",SUM(amount)-SUM(fee_amount) as "NetOS"
возвращает несколько столбцов в то, что SQL считает одним столбцом. Ты не можешь этого сделать.
И весь этот запрос Странный: вы, кажется, пытаетесь вернуть разные столбцы в зависимости от содержимого строки, и это просто глупо: если строка содержит "BTOS", то верните столбец с именем OSCount, в противном случае верните другой столбец с именем "RCount"?

Я не уверен, какую проблему вы пытаетесь решить здесь, но это определенно не тот способ сделать это.


Member 13400047

Спасибо за Ваш быстрый поворот, я пытаюсь вернуть сумму и количество различных столбцов в зависимости от содержимого строки и группы по еженедельным данным. Этот запрос возвращает данные, как и ожидалось, но проблема заключается в том, что первый оператор select каждой недели показывает все результаты второго оператора select.Я ожидаю, что если строка содержит "BTOS" , то верните эти выбранные столбцы, если строка содержит"BR", то верните выбранные столбцы суммируйте суммы за каждую неделю данных и группируйте по каждой неделе

выберите * из
(Выберите функция dateadd(неделя,функция datediff(неделя,0,R_DATE),0) как дата,

COUNT (*) как " OSCount"
, сумма (сумма) как "валовая ОС"
, SUM (fee_amount) as "плата за ОС"
,SUM(amount) - сумма (fee_amount) как " чистая ОС"

От [TVDEV]. [dbo].[РНН]как АТ1, где ТТ='BTOS и группа R_STATUS='R' на функция dateadd(неделя,функция datediff(неделя,0,R_DATE),0)) как ОС,

(ВЫБИРАТЬ
DATEADD(WEEK, DATEDIFF(week, 0, R_DATE), 0) как rdate,
COUNT (*) как "RCount"
,SUM(amount) - сумма (fee_amount) как "R"

От [tvDEV]. [dbo].[РНН]как АТ2 где TT='БР' и группа R_STATUS='R' на функция dateadd(неделя,функция datediff(неделя,0,R_DATE),0)) как оборот

Рейтинг:
0

Graeme_Grant

Это совет при написании SQL-операторов... Это помогает правильно и последовательно форматировать ваш SQL, чтобы лучше видеть, что происходит:

SELECT ( 
    CASE TT WHEN 'BTOS'
        THEN (
            SELECT DATEADD(week, DATEDIFF(week, 0, R_DATE), 0) as Date,
                   COUNT(*)as "OSCount",
                   SUM(amount) as "Gross OS",
                   SUM(fee_amount) as "OS Fee",
                   SUM(amount) - SUM(fee_amount) as "NetOS"
            FROM [TVDEV].[dbo].[TRN]
            GROUP BY DATEADD(week, DATEDIFF(week, 0, R_DATE), 0)
        )
        WHEN 'BTR' THEN  (
            SELECT DATEADD(week, DATEDIFF(week, 0, R_DATE), 0) as Date,
                   COUNT(*) as "RCount",
                   SUM(amount) - SUM(fee_amount) as "R",
                   NetOS-R as Deposit
            FROM [TVDEV].[dbo].[TRN]
            GROUP BY DATEADD(week, DATEDIFF(week, 0, R_DATE), 0)
        )
        ELSE
            null
    END) as TT
      
 FROM [TVDEV].[dbo].[TRN] where R_STATUS='R'