Вставьте строку поверх данных с именем дня названия столбцов

#sql #sql-server

Вопрос:

я создаю динамическую таблицу по дате на основе выбора пользователя, предположим, пользователь выбирает дату с 15-9 по 19-9, поэтому я создаю таблицу, как показано ниже, в которой у меня есть даты в виде столбцов

я создаю этот запрос в качестве примера для воспроизведения этой таблицы

 with dates ( [15/09/2018],[16/09/2018],[17/09/2018],[18/09/2018],[19/09/2018]) as 
(  select  '1' ,'0','1','1','1' union all
   select  '1' ,'0','0','1','1' union all
   select  '1' ,'0','1','0','1' union all
   select  '0' ,'0','1','1','1' union all
   select  '0' ,'0','0','1','0'
)
select  [15/09/2018],[16/09/2018],[17/09/2018],[18/09/2018],[19/09/2018]  from dates
 

теперь я хочу создать временную таблицу в SQL, в которой у меня есть дополнительная строка, в которой указан день имени заголовка столбца
, например, 15/09/2018, имя дня-ср и так далее

[15/09/2018] [16/09/2018] [16/09/2018] [16/09/2018] [16/09/2018]
Среда Четверг Пятница Суббота Воскресенье
1 0 1 1 1
1 0 0 1 1
1 0 1 0 1
0 0 1 1 1
0 0 0 1 0

не уверен, что искать и как это сделать

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

Комментарии:

1. Хотя это странная идея, ваш SQL и так в порядке. dbfiddle.uk/…

2. Если вы спрашиваете, можете ли вы запросить имена столбцов (которые представлены в виде дат), а затем определить связанное с ними название дня этой «даты», это просто плохая идея. У вас должно быть другое общее требование, которое определяет этот странный дизайн. Вероятно, лучше всего просто изменить дизайн. Вы, конечно, могли бы попытаться использовать information_schema для получения этой детали.

3. это очень простое требование , у меня есть данные , сохраненные как дата, теперь мне просто нужна строка с именем дня этой даты

4. я хочу, чтобы SQL был динамичным, чтобы получить таблицу date2(это может быть временная таблица ) из таблицы дат

5. @Ahteshamulhaq, добавьте OrderByColumn во внутренний запрос ( ... select 0, 'Wednesday' ,'Thursday','Friday','Saturday','Sunday' union all 1, select '1' ,'0','1','1','1' union all ... ) и используйте этот столбец для упорядочения результатов.

Ответ №1:

Вы можете создать временную таблицу с именами столбцов как часть вашего выбора, используя select into :

 with dates2(...)
select
[15/09/2018],[16/09/2018],[17/09/2018],[18/09/2018],[19/09/2018]
into #MyTempTable
from dates2
 

Комментарии:

1. как я уже упоминал, заголовок столбца является своего рода динамическим, поэтому нам нужно читать его динамично 🙁

2. Тогда не совсем понятно, о чем именно идет речь в вашем вопросе. В вашем вопросе нет ничего, кроме конкретного запроса, который у вас есть в данный момент — вы вообще не объяснили это хорошо, к сожалению, нет ничего о том, откуда берутся ваши данные, или даже о схеме или содержимом вашей таблицы, как написано, похоже, у вас уже есть то, что вам нужно.

Ответ №2:

В принципе, вы можете создать таблицу, затем использовать information_schema для получения имен столбцов, которые можно использовать для создания названий дней для каждого имени столбца, а затем PIVOT преобразовать этот результат в строку UNION , которая будет включена в данные.

 CREATE TABLE test (
   [15/09/2018]   varchar(12)
 , [16/09/2018]   varchar(12)
 , [17/09/2018]   varchar(12)
 , [18/09/2018]   varchar(12)
 , [19/09/2018]   varchar(12)
);

with dates2 (col1, col2, col3, col4, col5) as 
(
   select  '1' ,'0','1','1','1' union all
   select  '1' ,'0','0','1','1' union all
   select  '1' ,'0','1','0','1' union all
   select  '0' ,'0','1','1','1' union all
   select  '0' ,'0','0','1','0'
)
INSERT INTO test
select * from dates2
;

-- Adjusted to order by `ord` and to use `UNION ALL` to prevent removal of non-unique rows.

WITH cte AS (
         SELECT 1 AS ord, * FROM test
          UNION ALL
         SELECT 0 AS ord,
           [1], [2], [3], [4], [5]
         FROM
         (
           SELECT ORDINAL_POSITION, DATENAME(dw, CONVERT(DATE, COLUMN_NAME, 103)) AS colname
             FROM INFORMATION_SCHEMA.columns
            WHERE table_schema = 'dbo'
              AND table_name   = 'test'
         ) AS SourceTable
         PIVOT
         (
           MAX( colname )
           FOR ORDINAL_POSITION IN ([1], [2], [3], [4], [5])
         ) AS PivotTable
     )
SELECT * FROM cte ORDER BY ord
;
 

и создать временную таблицу:

 WITH cte AS (
         SELECT 1 AS ord, * FROM test
          UNION ALL
         SELECT 0 AS ord,
           [1], [2], [3], [4], [5]
         FROM
         (
           SELECT ORDINAL_POSITION, DATENAME(dw, CONVERT(DATE, COLUMN_NAME, 103)) AS colname
             FROM INFORMATION_SCHEMA.columns
            WHERE table_schema = 'dbo'
              AND table_name   = 'test'
         ) AS SourceTable
         PIVOT
         (
           MAX( colname )
           FOR ORDINAL_POSITION IN ([1], [2], [3], [4], [5])
         ) AS PivotTable
     )
SELECT * INTO #TmpTable FROM cte
;

SELECT * FROM #TmpTable ORDER BY ord;
 

Тестовый случай:

Рабочий Тестовый Случай. Смотрите последние панели

Результат:

введите описание изображения здесь