Не удается отсортировать данные по мере необходимости в результатах запроса с использованием SQL Server 2016

Вот код ES6, который делает то, что вы хотите

const truncateTo = (unRouned, nrOfDecimals = 2) => {
      const parts = String(unRouned).split(".");

      if (parts.length !== 2) {
          // without any decimal part
        return unRouned;
      }

      const newDecimals = parts[1].slice(0, nrOfDecimals),
        newString = `${parts[0]}.${newDecimals}`;

      return Number(newString);
    };

// your examples 

 console.log(truncateTo(5.467)); // ---> 5.46

 console.log(truncateTo(985.943)); // ---> 985.94

// other examples 

 console.log(truncateTo(5)); // ---> 5

 console.log(truncateTo(-5)); // ---> -5

 console.log(truncateTo(-985.943)); // ---> -985.94

-1
задан Melinda 7 March 2019 в 20:32
поделиться

1 ответ

Из того, что вы предоставили, похоже, что вы должны вернуть все RTN=1 строк, каждая с полным набором из 2 и 3 строк под ним, в порядке RN,RTN.

Если это правильно, похоже, что один из способов добиться этого - UNION ALL, который дублирует 2 и 3 для каждого 1, а затем предоставляет искусственный столбец для упорядочения.

SELECT * , RTN AS Ord
FROM..WHERE..AND RTN=1
UNION ALL 
SELECT t1.* , t2.RTN AS Ord
FROM myTable t1
CROSS JOIN myTable t2
WHERE..AND t1.RTN<>1 AND t2.RTN=1
ORDER BY Ord,RN,RTN

РЕДАКТИРОВАТЬ:

Хорошо, я вижу то, что я пропустил. Нам нужно фактически использовать RN AS Ord, а также нам нужно добавить еще один искусственный столбец, чтобы заставить записи POLR попасть в начало их группировки. Вот так:

SELECT *, RN AS Ord, 1 AS Ord2
FROM myTable 
WHERE..AND RTN=1
UNION ALL 
SELECT t1.* , t2.RN AS Ord, 2 AS Ord2
FROM myTable t1
CROSS JOIN myTable t2
WHERE..AND t1.RTN<>1 AND t2.RTN=1
ORDER BY Ord,Ord2,RN,RTN

Я проверил это, и оно работает:

CREATE TABLE #tmp (
    L1 char(1)
 ,  I1 int
 ,  I2 int
);

INSERT INTO #tmp
VALUES 
    ('a',1,1)
,   ('a',1,2)
,   ('c',2,1)
,   ('d',3,1)
,   ('c',2,2)
,   ('d',3,2)
;

SELECT *, I2 AS Ord, 1 AS Ord2
FROM #tmp
WHERE I1=1
UNION ALL 
SELECT t1.*, t2.I2 AS Ord, 2 AS Ord2
FROM #tmp t1
CROSS JOIN #tmp t2
WHERE t1.I1<>1 AND t2.I1=1
ORDER BY Ord, Ord2, I2, I1
;


DROP TABLE #tmp;
0
ответ дан Tab Alleman 7 March 2019 в 20:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: