Отображение данных с использованием SQL - PullRequest
2 голосов
/ 11 февраля 2011

У меня есть данные в таблице SQL в следующем порядке:

Order Num Material ReqstDate   ReqstQty  ConfDate    ConfQty ShippedDate ShippedQty
===== === ======== ==========  ========  ==========  ======= =========== ==========
1001  1   ABC      01/10/2011  2500      01/12/2011  500     01/13/2011  500 
1001  1   ABC      99/99/9999  0         01/15/2011  2000    01/17/2011  1000
1001  1   ABC      99/99/9999  0         99/99/9999  0       01/19/2011  700
1001  1   ABC      99/99/9999  0         99/99/9999  0       01/21/2011  300
1001  2   EFG      02/15/2011  3750      02/20/2011  3500    02/21/2011  3000
1001  2   EFG      99/99/9999  0         99/99/9999  0       02/22/2011  500

Я хочу, чтобы вышеуказанные данные отображались таким образом:

Order Num Material ReqDate    ReqQty ConfDate    ConfQty ShippedDate ShippedQty
===== === ======== =======    ====== ==========  ======= =========== ==========
1001  1   ABC      01/10/2011 2500   01/12/2011  500     01/13/2011  500 
                                     01/15/2011  2000    01/17/2011  1000
                                                         01/19/2011  500
                                                         01/20/2011  500
      2   EFG      02/15/2011 3750   02/10/2011  3500    01/21/2011  3000
                                                         01/22/2001  500

Ответы [ 4 ]

2 голосов
/ 11 февраля 2011

Это невозможно с запросом SQL.

Кажется, проблема может быть решена с помощью инструмента отчетности (например, BIRT для Eclipse ). С его помощью вы можете группировать поля, как вы хотите.

1 голос
/ 11 февраля 2011

SQL Server Вы хотите, чтобы это отображалось .Обычно это делается где-то не в SQL.Но если вы установите вывод для текста в MSSMS, вы можете использовать это, чтобы получить желаемый вывод.

declare @T table
(
  [Order] char(4), Num char(1), Material char (3), ReqstDate char(10), ReqstQty char(4),
  ConfDate char(10), ConfQty char(4), ShippedDate char(10), ShippedQty char(4)
)

insert into @T values
('1001', '1', 'ABC', '01/10/2011', '2500', '01/12/2011', '500 ', '01/13/2011', '500 '), 
('1001', '1', 'ABC', '99/99/9999', '0   ', '01/15/2011', '2000', '01/17/2011', '1000'),
('1001', '1', 'ABC', '99/99/9999', '0   ', '99/99/9999', '0   ', '01/19/2011', '700 '),
('1001', '1', 'ABC', '99/99/9999', '0   ', '99/99/9999', '0   ', '01/21/2011', '300 '),
('1001', '2', 'EFG', '02/15/2011', '3750', '02/20/2011', '3500', '02/21/2011', '3000'),
('1001', '2', 'EFG', '99/99/9999', '0   ', '99/99/9999', '0   ', '02/22/2011', '500 ')

;with cte as
(
  select
    [Order],
    Num,
    Material,
    ReqstDate,
    ReqstQty,
    ConfDate,
    ConfQty,
    ShippedDate,
    ShippedQty,
    row_number() over(order by cast(ShippedDate as datetime)) as n
  from @T
)
select
  isnull(nullif(C1.[Order], C2.[Order]), '') as [Order],
  isnull(nullif(C1.Num, C2.Num), '') as Num,
  isnull(nullif(C1.Material, C2.Material), '') as Material,
  isnull(nullif(C1.ReqstDate, '99/99/9999'), '') as ReqstDate,
  isnull(nullif(C1.ReqstQty, '0   '), '') as ReqstQty,
  isnull(nullif(C1.ConfDate, '99/99/9999'), '') as ConfDate,
  isnull(nullif(C1.ConfQty, '0   '), '') as ConfQty,
  isnull(nullif(C1.ShippedDate, '99/99/9999'), '') as ShippedDate,
  isnull(nullif(C1.ShippedQty, '0   '), '') as ShippedQty
from cte as C1
  left outer join cte as C2
    on C1.n = C2.n+1
order by C1.n
0 голосов
/ 11 февраля 2011

SQL Server 2005 +.

;
WITH
  data ([Order], Num, Material, ReqstDate, ReqstQty, ConfDate, ConfQty,
    ShippedDate, ShippedQty)
  AS (
    SELECT 1001, 1, 'ABC', '01/10/2011', 2500, '01/12/2011',  500, '01/13/2011',  500  UNION ALL
    SELECT 1001, 1, 'ABC', '99/99/9999',    0, '01/15/2011', 2000, '01/17/2011', 1000  UNION ALL
    SELECT 1001, 1, 'ABC', '99/99/9999',    0, '99/99/9999',    0, '01/19/2011',  700  UNION ALL
    SELECT 1001, 1, 'ABC', '99/99/9999',    0, '99/99/9999',    0, '01/21/2011',  300  UNION ALL
    SELECT 1001, 2, 'EFG', '02/15/2011', 3750, '02/20/2011', 3500, '02/21/2011', 3000  UNION ALL
    SELECT 1001, 2, 'EFG', '99/99/9999',    0, '99/99/9999',    0, '02/22/2011',  500
  ),
  numbereddata AS (
    SELECT
      [Order], Num, Material, ReqstDate, ReqstQty,
      ConfDate, ConfQty, ShippedDate, ShippedQty,
      rownum1 = ROW_NUMBER() OVER (PARTITION BY [Order] ORDER BY Num, CONVERT(datetime, ShippedDate)),
      rownum2 = ROW_NUMBER() OVER (PARTITION BY [Order], Num ORDER BY CONVERT(datetime, ShippedDate))
    FROM data
  )
SELECT
  [Order]  = CASE rownum1 WHEN 1 THEN CAST([Order] AS varchar) ELSE '' END,
  Num      = CASE rownum2 WHEN 1 THEN CAST(Num AS varchar) ELSE '' END,
  Material = CASE rownum2 WHEN 1 THEN CAST(Num AS varchar) ELSE '' END,

  ReqstDate = CASE ReqstDate WHEN '99/99/9999' THEN '' ELSE ReqstDate END,
  ReqstQty  = CASE ReqstDate WHEN '99/99/9999' THEN '' ELSE CAST(ReqstQty AS varchar)  END,

  ConfDate = CASE ConfDate WHEN '99/99/9999' THEN '' ELSE ConfDate END,
  ConfQty  = CASE ConfDate WHEN '99/99/9999' THEN '' ELSE CAST(ConfQty AS varchar)  END,

  ShippedDate = CASE ShippedDate WHEN '99/99/9999' THEN '' ELSE ShippedDate END,
  ShippedQty  = CASE ShippedDate WHEN '99/99/9999' THEN '' ELSE CAST(ShippedQty AS varchar)  END
FROM numbereddata nd
ORDER BY nd.[Order], nd.Num, CONVERT(datetime, nd.ShippedDate)
0 голосов
/ 11 февраля 2011

Это возможно, если вы используете tsql (т. Е. Microsoft SQL Server. Вы также пометили свой вопрос MySql, который является другой маркой базы данных) на сервере SQL, который поддерживает ROW_NUMBER (т. Е. Sql Server 2005 или более поздняя версия).

Я предполагаю, что ReqstDate, ConfDate и ShippedDate являются nvarchars (в противном случае было бы невозможно иметь значение '99 / 99/9999 'в этих полях).Вы должны преобразовать эти столбцы в поля даты и времени, в противном случае все предложения ORDER BY в запросе будут работать неправильно, если вы получите значение, подобное 15.01.2012 (запрос работает для заданного вами набора данных, но только потому, что все значения даты и времени находятся рядом с каждымдругой во времени, так что алфавитный порядок равен хронологическому порядку).Конечно, если вы собираетесь это сделать, вам нужно будет использовать NULL для '99 / 99/9999 'и для изменения запроса'! = '99 / 99/9999 '' на 'is null'.

Однако я бы посоветовал использовать инструмент создания отчетов или простой выбор и некоторый код для создания нужной таблицы.Запрос довольно сложный и сложный в обслуживании.Как правило, база данных предоставляет вызывающему данные, в то время как все форматирование должно выполняться самим вызывающим абонентом.

Редактировать: Ответ Микаэля Эрикссона лучше и проще, чем мой.Однако мое замечание по поводу полей даты и времени остается в силе.

select case when ROW_NUMBER() over (partition by [Order] Order by [order]) = 1
             and [order] != 0
       then cast([Order] as nvarchar)
       else ''
   end as [order],
   case when ROW_NUMBER() over (partition by [order], num 
                                Order by [order], num) = 1
             and num != 0
       then cast(num as nvarchar)
       else ''
   end as num,
   case when ROW_NUMBER() over (partition by [order], num, Material 
                                Order by [order], num, Material) = 1
       then Material
       else ''
   end as Material,
   case when ROW_NUMBER() over (partition by [order], num, Material, ReqstDate 
                                Order by [order], num, Material, ReqstDate) = 1
             and ReqstDate != '99/99/9999'
       then ReqstDate
       else ''
   end as ReqstDate,       
   case when ROW_NUMBER() over (partition by [order], num, Material, ReqstDate, ReqstQty 
                                Order by [order], num, Material, ReqstDate, ReqstQty) = 1
             and ReqstQty != 0
       then cast(ReqstQty as nvarchar)
       else ''
   end as ReqstQty, 
   case when ROW_NUMBER() over (partition by [order], num, Material, ReqstDate, ReqstQty, ConfDate 
                                Order by [order], num, Material, ReqstDate, ReqstQty, ConfDate) = 1
             and ConfDate != '99/99/9999'
       then ConfDate
       else ''
   end as ConfDate,    
   case when ROW_NUMBER() over (partition by [order], num, Material, ReqstDate, ReqstQty, ConfDate, ConfQty 
                                Order by [order], num, Material, ReqstDate, ReqstQty, ConfDate, ConfQty) = 1
             and ConfQty != 0
       then cast(ConfQty as nvarchar)
       else ''
   end as ConfQty,     
   case when ROW_NUMBER() over (partition by ShippedDate, num, Material, ReqstDate, ReqstQty, ConfDate, ConfQty, ShippedDate 
                                Order by ShippedDate, num, Material, ReqstDate, ReqstQty, ConfDate, ConfQty, ShippedDate) = 1
             and ShippedDate != '99/99/9999'
       then ShippedDate
       else ''
   end as ShippedDate,     
   case when ROW_NUMBER() over (partition by [order], num, Material, ReqstDate, ReqstQty, ConfDate, ConfQty, ShippedDate, ShippedQty 
                                Order by [order], num, Material, ReqstDate, ReqstQty, ConfDate, ConfQty, ShippedDate, ShippedQty) = 1
             and ShippedQty != 0
       then cast(ShippedQty as nvarchar)
       else ''
   end as ShippedQty
   from yourTable
   order by ROW_NUMBER() over (order by [order], num, Material, ReqstDate, ReqstQty, ConfDate, ConfQty, ShippedDate, ShippedQty)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...