Невозможно упорядочить по столбцам без включения имен столбцов в группу по - PullRequest
0 голосов
/ 21 января 2020

Я не могу сделать заказ по запросу без включения имен столбцов в группу по. Попытка обновить последнюю запись следующими последними ненулевыми значениями. Но когда я обновляю запись, случайные не нулевые значения рассматриваются вместо следующих последних не нулевых значений, так как порядок не может быть выполнен, если не включен в группу по.

Таблица A

  ID     Name   zip  city  Mdate
  10001  Sarah  NULL NULL  02-20-2018 00:10:40:000
  98765  AJ     NULL Asia  03-25-2018 10:10:45:000
  12345  NULL   7511 Texas 03-20-2018 22:10:00:000

Таблица B

  ID     RollNo     Cdate
  12345   1    01-18-2018
  12345   2    01-22-2018
  12345   3    03-20-2018 
  98765   9    01-18-2018
  98765   8    01-22-2018
  98765   7    03-20-2018
  10001   10   03-08-2018 
  10001   11   01-15-2018
  10001   12   02-20-2018

TABLE C

  Rollno Name  Zip  City  Mdate
    1    NULL  7511 Texas 01-18-2018 15:10:00:000 
    2    John  5001 NULL 01-22-2018 10:05:00:000
    3    NULL  7000 Rome 03-20-2018 22:10:00:000
    10   Sarah NULL NULL 03-08-2018 01:00:20:000
    11   Tom   5500 NULL 01-15-2018 15:10:00:000
    12   NULL  4500 Pune 02-20-2018 00:10:40:000
    9    AJ    NULL Asia 01-18-2018 23:01:02:000
    8    MATT  NULL Ohio 01-22-2018 20:00:05:000
    7    NULL  8000 NULL 03-25-2018 10:10:45:000 

Запрос:

    Update #temp SET Name = C.name
    Zip = C.ZIP
    ,City=C.city

   FROM
   (
   SELECT A.ID,
   CASE 
   WHEN MAX(A.Name) IS NULL THEN MAX(C.Name) 
   ELSE Max(A.Name) 
   END Name,
   CASE
   WHEN MAX(A.Zip) IS NULL THEN Max(C.Zip)
   ELSE MAX(A.Zip)
   END Zip,
   CASE 
   WHEN MAX(A.City) IS NULL THEN Max(C.City) 
   ELSE MAX(A.City) 
   END City,
   A.Mdate
   FROM table_a A
   INNER JOIN Table_B B ON A.ID = B.ID
   INNER JOIN table_c C ON B.RollNo = C.RollNo
   GROUP BY A.ID,A.Mdate
   )

Набор результатов:

   ID     Name   zip  city  Mdate
  10001  Sarah  5500 Pune  03-08-2018 01:00:20:000
  98765  AJ     8000 Asia  03-25-2018 10:10:45:000 
  12345  John   7511 Rome  03-20-2018 22:10:00:000 

Фактический вывод:

   ID     Name   zip  city  Mdate
  10001  Sarah  4500 Pune  03-08-2018 01:00:20:000
  98765  MATT   8000 ohio  03-25-2018 10:10:45:000 
  12345  John   7000 Rome  03-20-2018 22:10:00:000 

Если в последних записях содержатся нулевые значения, следует обновить следующие последние записи, не имеющие нулевого значения. В запросе не удалось указать порядок для таблицы C mdate. Я взял последние значения во временную таблицу и выполняю обновление только для указанных c столбцов.

1 Ответ

0 голосов
/ 23 января 2020

Вот как я бы go упорядочил в подзапросе, это не дает результирующий набор, который вы ищете (ваш исходный запрос также не выдает фактический результат из предоставленного набора данных), но это это метод, который я бы использовал для решения этой проблемы.

create table #temp (id int, name char(5), zip char(5), city char(5));

       declare @table_a table (id int, name char(5), city char(5), zip char(5), mdate datetime);

       insert @table_a
       values(10001,  'Sarah',  NULL, NULL,  '02-20-2018 00:10:40:000'),
       (98765,  'AJ',     NULL, 'Asia',  '03-25-2018 10:10:45:000'),
       (12345,  NULL,   7511, 'Texas', '03-20-2018 22:10:00:000');

       declare @table_b table (id int, rollno int, Cdate datetime);

       insert @table_b ( ID,     RollNo,     Cdate)
       values
  (12345,   1,    '01-18-2018'),
  (12345,   2,    '01-22-2018'),
  (12345,   3,    '03-20-2018'),
  (98765,   9,    '01-18-2018'),
  (98765,   8,    '01-22-2018'),
  (98765,   7,    '03-20-2018'),
  (10001,   10,   '03-08-2018'), 
  (10001,   11,   '01-15-2018'),
  (10001,   12,   '02-20-2018');

       declare @table_c table ( rollno int, name char(5), city char(5), zip char(5),mdate datetime);

       insert @table_c(  Rollno, Name,  Zip,  City,  Mdate)
       values
    (1,    NULL,  7511, 'Texas', '01-18-2018 15:10:00:000'), 
    (2,    'John',  5001, NULL, '01-22-2018 10:05:00:000'),
    (3,    NULL,  7000, 'Rome', '03-20-2018 22:10:00:000'),
    (10,   'Sarah', NULL, NULL, '03-08-2018 01:00:20:000'),
    (11,   'Tom',   5500, NULL, '01-15-2018 15:10:00:000'),
    (12,   NULL,  4500, 'Pune', '02-20-2018 00:10:40:000'),
    (9,    'AJ',    NULL, 'Asia', '01-18-2018 23:01:02:000'),
    (8,    'MATT',  NULL, 'Ohio', '01-22-2018 20:00:05:000'),
    (7,    NULL,  8000, NULL, '03-25-2018 10:10:45:000');

       declare @count int = coalesce((select count(*) from #temp), 100);

    --Update t SET t.Name = C.name,
    --t.Zip = C.ZIP,
    --t.City=C.city

select * 
   FROM
   (
   SELECT top (@count) A.ID,
   CASE 
   WHEN MAX(A.Name) IS NULL THEN MAX(C.Name) 
   ELSE Max(A.Name) 
   END Name,
   CASE
   WHEN MAX(A.Zip) IS NULL THEN Max(C.Zip)
   ELSE MAX(A.Zip)
   END Zip,
   CASE 
   WHEN MAX(A.City) IS NULL THEN Max(C.City) 
   ELSE MAX(A.City) 
   END City,
   A.Mdate
   FROM @table_a A
   INNER JOIN @Table_B B ON A.ID = B.ID
   INNER JOIN @table_c C ON B.RollNo = C.RollNo
   GROUP BY A.ID,A.Mdate
   order by A.Mdate
   ) C 


   drop table #temp;

Если вам нужно упорядочить Mdate в производной таблице C, я бы использовал переменную, построенную из числа строк которую вы хотите обновить в таблице #temp, чтобы заполнить оператор top в вашем подзапросе. Таким образом, вы можете контролировать порядок.

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