Я не могу заставить мой общий итог правильно рассчитать - PullRequest
0 голосов
/ 22 ноября 2011

Когда я запускаю этот запрос ниже,

SELECT clientid, 
       CASE WHEN D.ccode = '-1' Then 'Did Not Show' ELSE D.ccode End ccode,  
       ca, 
       ot, 
       bw, 
       cshT, 
       dc, 
       dte, 
       approv 
  FROM dbo.emC D 
 WHERE year(dte) = year(getdate())

Я получаю правильные результаты.

Это правильный результат, потому что код показывает «Не показано», когда значение в БД равно'-1'

Однако, когда я делаю UNION ALL, чтобы получить итоговую сумму для каждого столбца, я получаю результаты, но тогда «Не показывать» больше не отображается, когда значение valye для ccode равно -1'.

Существует более 1000 записей со значением' -1 '.

Может кто-нибудь помочь?

Вот весь код с UNION.

SELECT clientid, 
CASE WHEN D.ccode = '-1' Then 'Did Not Show' ELSE D.ccode End ccode,  
ca, 
ot, 
bw, 
cshT, 
dc, 
dte, 
approv 
FROM dbo.emC D WhERE year(dte) = year(getdate())
UNION ALL   
SELECT 'Total',
 '', 
 SUM(D.ca), 
 SUM(D.ot), 
 SUM(D.bw), 
 SUM(D.cshT),
'',
'',
'' 
  FROM emC D 
 WHERE YEAR(dte)='2011'

Я также пытался использовать ROLLUP, но реальная проблема заключается в том, что я не могуполучить текст «Не показывать», который будет отображаться, когда значение кода равно -1

ClientID        CCODE           ot      ca      bw      cshT
019692  CF001           0.00    0.00    1.00    0.00   0.00   
019692  CH503           0.00    0.00    1.00    0.00   0.00
010487  AC407           0.00    0.00    1.00    0.00   0.00
028108  CH540           0.00    0.00    1.00    0.00   0.00
028108  GS925           0.00    0.00    1.00    0.00   0.00
001038  AC428           0.00    0.00    3.00    0.00   0.00
028561  Did Not Show        0.00    0.00    0.00    0.00   0.00
016884  Did Not Show        0.00    0.00    0.00    0.00   0.00
05184   CF001           0.00    0.00    4.50    0.00   0.00

Ответы [ 2 ]

0 голосов
/ 23 ноября 2011

Я разобрался в проблеме. Союз действительно работал. Единственная проблема заключалась в том, что я запрашивал не ту таблицу, которая не имела значения '-1'.

Итак, по сути, я был прав, что UNION не имеет ничего общего с тем, почему запрос не работает. Это сработало бы, если бы у меня было значение, против которого я использовал оператор CASE.

0 голосов
/ 22 ноября 2011

Это происходит потому, что каждый оператор SQL в запросе UNION ALL должен иметь одинаковое количество полей в наборах результатов с одинаковыми типами данных.Цитируется из MSDN:

Ниже приведены основные правила объединения наборов результатов двух запросов с использованием UNION:

  • Число и порядок столбцов должны бытьодинаково во всех запросах.
  • Типы данных должны быть совместимы

Теперь ваш вывод «Не показывать» изменяет тип данных столбца.Попробуйте создать псевдостолбец в обоих запросах и получить вывод из двух столбцов, иначе укажите выходной файл, если регистр не найден в виде числового значения.

РЕДАКТИРОВАТЬ: код c типа nvarchar (50),Но когда вы выводите «Не показывать», он имеет текстовый тип, и возникает несоответствие типов данных.Можно задаться вопросом, что nvarchar должен уметь обрабатывать текст, но технически это несоответствие типов данных, и это создаст такие проблемы во время выполнения.Или, по крайней мере, это то, что я знаю в соответствии с моим пониманием ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...