Выберите только те столбцы, которые имеют значения, отличные от 0 | SQL Server 2016 - PullRequest
0 голосов
/ 01 июля 2019

У меня есть такая таблица:

ID, ColA, ColB, ColC, ColD
---------------------------
10,   0,    4,    6,    9
11,   0,    3,    3,    8

Когда сумма заданного столбца> 0, я хочу выбрать ее.Таким образом, количество столбцов в запросе варьируется в зависимости от суммы.

Любые предложения будут хорошими.На самом деле я не знаю, как поступить, поэтому у меня пока нет попыток написания кода.

Ответы [ 4 ]

1 голос
/ 01 июля 2019

Прежде всего, этот запрос звучит довольно странно, он пахнет плохим дизайном.

Но все же, если вы хотите добиться этого, я бы сделал это так с динамическим SQL:

Declare @ShowColA bit
Declare @ShowColB bit
Declare @ShowColC bit
Declare @ShowColD bit
Declare @sqlCommand varchar(max)

IF (SELECT SUM(ColA) FROM yourTable) > 0
    SET @ShowColA = 1
IF (SELECT SUM(ColB) FROM yourTable) > 0
    SET @ShowColB = 1
IF (SELECT SUM(ColC) FROM yourTable) > 0
    SET @ShowColC = 1
IF (SELECT SUM(ColD) FROM yourTable) > 0
    SET @ShowColD = 1

SET @sqlCommand = 'SELECT Id'
IF @ShowColA<> 0 SET @sqlCommand = @sqlCommand + ', ColA'
IF @ShowColB<> 0 SET @sqlCommand = @sqlCommand + ', ColB'
IF @ShowColC<> 0 SET @sqlCommand = @sqlCommand + ', ColC'
IF @ShowColD<> 0 SET @sqlCommand = @sqlCommand + ', ColD'
SET @sqlCommand = @sqlCommand + ' FROM yourTable'

EXEC @sqlCommand
1 голос
/ 01 июля 2019

Следующий запрос должен делать то, что вы хотите:

CREATE TABLE #temp (ID INT, ColA INT, ColB INT, ColC INT, ColD INT)

INSERT INTO #temp VALUES
(10,   0,    4,    6,    9),
(11,   0,    3,    3,    8)

DECLARE @Col VARCHAR(100) = '';

SELECT @Col += ',' + [Col] FROM #temp
UNPIVOT (
Val for Col In ([ColA],[ColB],[ColC],[ColD]))unpiv
GROUP BY Col
HAVING SUM(Val) > 0;

SET @Col = STUFF(@Col,1,1,'');

EXEC ('SELECT [ID],'+@Col+' FROM #temp');

Результат, как показано ниже,

ID  ColB  ColC  ColD
10  4     6     9
11  3     3     8
0 голосов
/ 01 июля 2019

Вы можете попробовать это:

CREATE TABLE #TEST
(
  ID INT
, COLA INT
, COLB INT
, COLC INT
, COLD INT
);

INSERT INTO #TEST VALUES
(
10,   0,    4,    6,    9
),
(
11,   0,    3,    3,    8
);

BEGIN 

DECLARE @COLLIST AS VARCHAR(100)
DECLARE @RESULT AS INTEGER

SET @COLLIST = ''
SET @RESULT = (SELECT SUM(COLA) FROM #TEST)
IF @RESULT > 0
   SET @COLLIST = 'COLA'
SET @RESULT = (SELECT SUM(COLB) FROM #TEST)
IF @RESULT > 0
   IF @COLLIST <> ''
      SET @COLLIST = @COLLIST + ', '
   SET @COLLIST = @COLLIST + 'COLB'
SET @RESULT = (SELECT SUM(COLC) FROM #TEST)
IF @RESULT > 0
   IF @COLLIST <> ''
      SET @COLLIST = @COLLIST + ', '
   SET @COLLIST = @COLLIST + 'COLC'
SET @RESULT = (SELECT SUM(COLD) FROM #TEST)
IF @RESULT > 0
   IF @COLLIST <> ''
      SET @COLLIST = @COLLIST + ', '
   SET @COLLIST = @COLLIST + 'COLD'   

IF @COLLIST <> ''
   BEGIN
       PRINT ('SELECT ' + @COLLIST + ' FROM #TEST')
       EXEC ('SELECT ID, ' + @COLLIST + ' FROM #TEST')
   END

END

Результат:

ID COLB COLC COLD
10  4   6   9
11  3   3   8
0 голосов
/ 01 июля 2019

Я думаю, единственные возможные значения в таблице - неотрицательные. Таким образом, вы можете попытаться суммировать столбец с помощью SUM (), и если он равен 0, не берите его.

...