#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;
Тестовый случай:
Рабочий Тестовый Случай. Смотрите последние панели
Результат: