Как упорядочить группы строк в порядке чередования, при выводе запросов T-SQL - PullRequest
0 голосов
/ 04 июля 2018

Мне нужен кто-то, чтобы дать мне представление о том, как расположить эти строки.

Я хочу, чтобы строки следовали этому шаблону:

  1. TRNS
  2. SPL
  3. ENDTRNS

Это то, что у меня есть

+-------+------------+----------+------------+--------+
|  Id   | Trans Type | Document |    Date    | Amount |
+-------+------------+----------+------------+--------+
| 14184 | ENDTRNS    | NULL     | NULL       | NULL   |
| 14184 | ENDTRNS    | NULL     | NULL       | NULL   |
| 14184 | ENDTRNS    | NULL     | NULL       | NULL   |
| 14184 | ENDTRNS    | NULL     | NULL       | NULL   |
| 14184 | SPL        | INVOICE  | 01/07/1990 | -745   |
| 14184 | SPL        | INVOICE  | 01/07/1990 | -800   |
| 14184 | SPL        | INVOICE  | 01/07/1990 | -860   |
| 14184 | SPL        | INVOICE  | 01/07/1990 | -1170  |
| 14184 | TRNS       | INVOICE  | 01/07/1990 | 745    |
| 14184 | TRNS       | INVOICE  | 01/07/1990 | 800    |
| 14184 | TRNS       | INVOICE  | 01/07/1990 | 860    |
| 14184 | TRNS       | INVOICE  | 01/07/1990 | 1170   |
+-------+------------+----------+------------+--------+

Я пытаюсь получить следующее как конечный результат

+-------+------------+----------+------------+--------+
|  Id   | Trans Type | Document |    Date    | Amount |
+-------+------------+----------+------------+--------+
| 14184 | TRNS       | INVOICE  | 01/07/1990 | 1170   |
| 14184 | SPL        | INVOICE  | 01/07/1990 | -1170  |
| 14184 | ENDTRNS    | NULL     | NULL       | NULL   |
| 14184 | TRNS       | INVOICE  | 01/07/1990 | 860    |
| 14184 | SPL        | INVOICE  | 01/07/1990 | -860   |
| 14184 | ENDTRNS    | NULL     | NULL       | NULL   |
| 14184 | TRNS       | INVOICE  | 01/07/1990 | 800    |
| 14184 | SPL        | INVOICE  | 01/07/1990 | -800   |
| 14184 | ENDTRNS    | NULL     | NULL       | NULL   |
| 14184 | TRNS       | INVOICE  | 01/07/1990 | 745    |
| 14184 | SPL        | INVOICE  | 01/07/1990 | -745   |
| 14184 | ENDTRNS    | NULL     | NULL       | NULL   |
+-------+------------+----------+------------+--------+

Я думаю, что близко, это то, над чем я работаю

;WITH CTE_Sample AS 
(
    SELECT 
        '14184' AS [Id],
        'ENDTRNS' AS [Trans Type],
        'NULL' AS [Document],
        'NULL' AS [Date],
        'NULL' AS [Amount]
    UNION  ALL
    SELECT 
        '14184' AS [Id],
        'ENDTRNS' AS [Trans Type],
        'NULL' AS [Document],
        'NULL' AS [Date],
        'NULL' AS [Amount]
    UNION  ALL
    SELECT 
        '14184' AS [Id],
        'ENDTRNS' AS [Trans Type],
        'NULL' AS [Document],
        'NULL' AS [Date], 
        'NULL' AS [Amount]
UNION  ALL
SELECT '14184' AS [Id],'ENDTRNS' AS [Trans Type],'NULL' AS [Document],'NULL' AS [Date],'NULL' AS [Amount]
UNION  ALL
SELECT '14184' AS [Id],'SPL' AS [Trans Type],'INVOICE' AS [Document],'01/07/1990' AS [Date],'-745' AS [Amount]
UNION  ALL
SELECT '14184' AS [Id],'SPL' AS [Trans Type],'INVOICE' AS [Document],'01/07/1990' AS [Date],'-800' AS [Amount]
UNION  ALL
SELECT '14184' AS [Id],'SPL' AS [Trans Type],'INVOICE' AS [Document],'01/07/1990' AS [Date],'-860' AS [Amount]
UNION  ALL
SELECT '14184' AS [Id],'SPL' AS [Trans Type],'INVOICE' AS [Document],'01/07/1990' AS [Date],'-1170' AS [Amount]
UNION  ALL
SELECT '14184' AS [Id],'TRNS' AS [Trans Type],'INVOICE' AS [Document],'01/07/1990' AS [Date],'745' AS [Amount]
UNION  ALL
SELECT '14184' AS [Id],'TRNS' AS [Trans Type],'INVOICE' AS [Document],'01/07/1990' AS [Date],'800' AS [Amount]
UNION ALL
SELECT '14184' AS [Id],'TRNS' AS [Trans Type],'INVOICE' AS [Document],'01/07/1990' AS [Date],'860' AS [Amount]
UNION ALL
SELECT '14184' AS [Id],'TRNS' AS [Trans Type],'INVOICE' AS [Document],'01/07/1990' AS [Date],'1170' AS [Amount]
)
SELECT 
    ID, [Trans Type], Document, [Date], Amount,
    ROW_NUMBER() OVER (PARTITION BY ID, [Trans Type] ORDER BY Amount ASC) AS rownum
FROM 
    CTE_Sample
ORDER BY 
    ROWNUM

Я не могу понять, как получить ENDTRNS в конце каждой группы строк сверху вниз

Ответы [ 4 ]

0 голосов
/ 04 июля 2018

попробуйте это,

;WITH CTE_Sample AS 
(
    SELECT 
        '14184' AS [Id],
        'ENDTRNS' AS [Trans Type],
        'NULL' AS [Document],
        'NULL' AS [Date],
        NULL AS [Amount]
    UNION  ALL
    SELECT 
        '14184' AS [Id],
        'ENDTRNS' AS [Trans Type],
        'NULL' AS [Document],
        'NULL' AS [Date],
        NULL AS [Amount]
    UNION  ALL
    SELECT 
        '14184' AS [Id],
        'ENDTRNS' AS [Trans Type],
        'NULL' AS [Document],
        'NULL' AS [Date], 
        NULL AS [Amount]
UNION  ALL
SELECT '14184' AS [Id],'ENDTRNS' AS [Trans Type],'NULL' AS [Document],'NULL' AS [Date],NULL AS [Amount]
UNION  ALL
SELECT '14184' AS [Id],'SPL' AS [Trans Type],'INVOICE' AS [Document],'01/07/1990' AS [Date],-745 AS [Amount]
UNION  ALL
SELECT '14184' AS [Id],'SPL' AS [Trans Type],'INVOICE' AS [Document],'01/07/1990' AS [Date],-800 AS [Amount]
UNION  ALL
SELECT '14184' AS [Id],'SPL' AS [Trans Type],'INVOICE' AS [Document],'01/07/1990' AS [Date],-860 AS [Amount]
UNION  ALL
SELECT '14184' AS [Id],'SPL' AS [Trans Type],'INVOICE' AS [Document],'01/07/1990' AS [Date],-1170 AS [Amount]
UNION  ALL
SELECT '14184' AS [Id],'TRNS' AS [Trans Type],'INVOICE' AS [Document],'01/07/1990' AS [Date],745 AS [Amount]
UNION  ALL
SELECT '14184' AS [Id],'TRNS' AS [Trans Type],'INVOICE' AS [Document],'01/07/1990' AS [Date],800 AS [Amount]
UNION ALL
SELECT '14184' AS [Id],'TRNS' AS [Trans Type],'INVOICE' AS [Document],'01/07/1990' AS [Date],860 AS [Amount]
UNION ALL
SELECT '14184' AS [Id],'TRNS' AS [Trans Type],'INVOICE' AS [Document],'01/07/1990' AS [Date],1170 AS [Amount]
)
SELECT ID,[Trans Type],Document,[Date],Amount 
,ROW_NUMBER() OVER (PARTITION BY ID,[Trans Type] ORDER BY abs(Amount) desc) AS rownum
FROM CTE_Sample
ORDER BY rownum ,CASE [Trans Type] 
                             WHEN 'TRNS' THEN 1 
                             WHEN 'SPL' THEN 2
                             WHEN 'ENDTRNS' THEN 3 END
0 голосов
/ 04 июля 2018

У вас была сумма как текст (varchar). Это портит вид

SELECT ID, [Trans Type], Document,[Date], Amount 
  , ROW_NUMBER() OVER (PARTITION BY ID, [Trans Type] 
                       ORDER BY abs(isnull(Amount, '0')) desc ) AS rownum
FROM CTE_Sample
ORDER BY ROWNUM, [Trans Type] desc 
0 голосов
/ 04 июля 2018

запрос, который я разместил, является частью большего. Для этого конкретного примера я использовал

SELECT ID,[Trans Type],Document,[Date],Amount 
,ROW_NUMBER() OVER (PARTITION BY ID,[Trans Type] ORDER BY Amount  asc ) AS rownum
FROM CTE_Sample
ORDER BY rownum,CASE [Trans Type] 
                             WHEN 'TRNS' THEN 1 
                             WHEN 'SPL' THEN 2
                             WHEN 'ENDTRNS' THEN 3 END

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

0 голосов
/ 04 июля 2018

Я думаю, вы хотите идентификатор транзакции, как только у вас есть, что вы можете сделать это:

SELECT ID,[Trans Type],Document,[Date],Amount 
FROM CTE_Sample
ORDER BY ID_BY_TRANSACTION, CASE [Trans Type] 
                             WHEN 'TRNS' THEN 1 
                             WHEN 'SPL' THEN 2
                             WHEN 'ENDTRNS' THEN 3 END

Где-то в вашей системе должен быть идентификатор транзакции.

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