Вот код 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
Из того, что вы предоставили, похоже, что вы должны вернуть все 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;