Показать все столбцы, где экземпляры столбца case_num> 1 и упорядочены по сумме des c за case_num - PullRequest
1 голос
/ 14 января 2020

У меня есть таблица счетов-фактур, в которой я хотел бы отобразить записи, в которых имеется более 1 экземпляра [case_num], упорядоченный по убыванию usd_amt, но хранящий записи case_num вместе.

Первая запись должно быть самое высокое значение usd_amt, за которым следуют все записи с одинаковым case_num (отображается usd_amt DES C), следующая запись должна быть следующей по величине usd_amt, за которой следуют все записи с таким же case_num (отображается usd_amt DES C) и

пример таблицы:

CREATE TABLE [dbo].[Invoices](
    [invoice_id] [int] NOT NULL,
    [case_num] [varchar](255) NULL,
    [usd_amt] [float] NULL,
PRIMARY KEY CLUSTERED 
(
    [invoice_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

пример данных:

INSERT INTO [dbo].[Invoices]
    ([invoice_id]
    ,[case_num]
    ,[usd_amt])
VALUES
    (39341598,  '1.83722e+009|o|126547',  79752.6621),
    (40951156,  '1.83722e+009|o|126547',  79194.0256),
    (41809870,  '1.83722e+009|o|126547',  79190.6121),
    (42002432,  '3090|o|19319', 3090.00),
    (39540302,  '3090|o|19319', 3090.00),
    (41182508,  '3090|o|19319',  120.00),
    (42825471,  '13959|o|8986',  130.95),
    (42825546,  '13959|o|8986',  130.95),
    (42959088,  '10274|o|8986',  96.64);

Желаемый результат:

invoice_id  case_num                usd_amt
39341598    1.83722e+009|o|126547   79752.6621
40951156    1.83722e+009|o|126547   79194.0256
41809870    1.83722e+009|o|126547   79190.6121
42002432    3090|o|19319            3090
39540302    3090|o|19319            3090
41182508    3090|o|19319            120
42825471    13959|o|8986            130.95
42825546    13959|o|8986            130.95

после прочтения некоторых других страниц SO Я думаю, что мне нужна некоторая комбинация использования ROW_NUMBER () для разбиения по case_num и присвоения порядкового номера или использования CTE, но я в данный момент застрял. Любые указатели в правильном направлении будут высоко оценены!

Ответы [ 2 ]

1 голос
/ 14 января 2020

Yoiu может использовать CTE и окно COUNT, а затем возвращать строки, в которых число больше 1:

WITH CTE AS(
    SELECT invoice_id,
           case_num,
           usd_amt,
           COUNT(invoice_id) OVER (PARTITION BY case_num) AS Invoices,
           MAX(usd_amt) OVER (PARTITION BY case_num) AS Max_usd
    FROM dbo.Invoices)
SELECT invoice_id,
       case_num,
       usd_amt
FROM CTE
WHERE Invoices > 1
ORDER BY Max_usd DESC,
         usd_amt DESC;
1 голос
/ 14 января 2020

Вы можете задать количество окон для case_num разделов в запросе (или CTE), а затем использовать его для хранения файлов. Для оформления заказа вы можете использовать окно макс.

select invoice_id, case_num, usd_amt
from (select t.*, count(*) over(partition by case_num) cnt from [dbo].[Invoices] t) t
where cnt > 1
order by max(usd_amt) over(partition by case_num) desc, usd_amt desc

Демо на БД Fiddlde :

invoice_id | case_num              |    usd_amt
---------: | :-------------------- | ---------:
  39341598 | 1.83722e+009|o|126547 | 79752.6621
  40951156 | 1.83722e+009|o|126547 | 79194.0256
  41809870 | 1.83722e+009|o|126547 | 79190.6121
  42002432 | 3090|o|19319          |       3090
  39540302 | 3090|o|19319          |       3090
  41182508 | 3090|o|19319          |        120
  42825471 | 13959|o|8986          |     130.95
  42825546 | 13959|o|8986          |     130.95
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...