Как назначить значение, если заголовок строки и заголовок столбца совпадают в SQL Server 2012? - PullRequest
0 голосов
/ 04 января 2019

В моей таблице 400 столбцов и заголовков строк.Вы можете представить это как матрицу с пустыми значениями.Необходимо назначить значение, когда заголовок столбца и строки совпадают.Подобно столбцам от A до A, затем присвойте значение от 6 A до B, присвойте значение 10.

Пример

enter image description here

Кто-нибудь может помочь мне получить этот вывод?

Ответы на SQL приветствуются, если функции Excel также не будут работать.

Ответы [ 3 ]

0 голосов
/ 04 января 2019

Хорошо, это жестко запрограммировано и создает таблицу, но:

  • Делает ли она то, что вы хотите?Да
  • Это эффективно?О нет.
  • Это масштабируется?Нет, но вы могли бы легко изменить это так.
  • Если вы действительно хотите, чтобы ваша СУБД сделала это?Определенно нет.

Наслаждайтесь:

DECLARE @SQL nvarchar(MAX);

WITH N AS (
    SELECT N
    FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL)) N(N)),
Tally AS (
    SELECT TOP 400
           ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
    FROM N N1
         CROSS JOIN N N2
         CROSS JOIN N N3)
SELECT @SQL = N'CREATE TABLE dbo.InsaneTable (' +
              STUFF((SELECT N',' + NCHAR(10) +
                            N'                              ' + QUOTENAME(CONCAT('Column',I)) + N' int DEFAULT 10'
                     FROM Tally
                     FOR XML PATH(N'')),1,32,N'') + ');';         
SELECT @SQL; --Your debugging friend. Not PRINT as we are way over 4,000 characters
EXEC sp_executesql @SQL;
GO
DECLARE @SQL nvarchar(MAX);

WITH N AS (
    SELECT N
    FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL)) N(N)),
Tally AS (
    SELECT TOP 400
           ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
    FROM N N1
         CROSS JOIN N N2
         CROSS JOIN N N3)
SELECT @SQL = STUFF((SELECT NCHAR(10) + N'INSERT INTO dbo.InsaneTable (' + QUOTENAME(c.[name]) + N') VALUES (6);'
                     FROM Tally Ty
                          JOIN sys.columns c ON c.column_id = Ty.I
                          JOIN sys.tables t ON c.object_id = t.object_id
                     WHERE t.[name] = 'InsaneTable'
                     FOR XML PATH(N'')),1,1,N'');
SELECT @SQL; --Your debugging friend. Not PRINT as we are way over 4,000 characters
EXEC sp_executesql @SQL;
GO

SELECT *
FROM dbo.InsaneTable;

GO
DROP TABLE dbo.InsaneTable;
0 голосов
/ 04 января 2019

Я предполагаю, что у вас есть один столбец (вероятно, первый или второй), содержащий так называемый «заголовок строки», так как таблицы sql не имеют имен строк или заголовков.

Предполагается, что этот столбец «заголовок строки»называется "column_a", а первый заголовок, например, ради "header_a", тогда достаточно запроса, подобного следующему:

select  column_a, 
(case when header_a = column_a 
then 6 else header_a end) from table 

Это может быть не лучшим решением для вашего вопроса.Если вы можете уточнить, что подразумевается под заголовком строки, возможно, будет предложено лучшее решение.

0 голосов
/ 04 января 2019

Если вы ищете значение, скажем 6 (как в вашем примере), которое появляется, когда имена столбцов и строк совпадают, и имеют другое значение (опять же, из вашего примера, 10), вы можете сделать что-тонапример:

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

=IF($A2=B$1, 6, 10)

в ячейке B2, затем перетащите вверх и вниз.Позвольте мне знать, если это помогает!Возможно, я не правильно понял вопрос.

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