SQL с условием секционированного столбца - PullRequest
0 голосов
/ 09 июля 2020

Когда я делаю этот запрос невложенным (включая -), я получаю то, что ищу. Однако мне нужен только номер строки (rn) <= 10. Затем, когда я вставляю его, я получаю сообщение об ошибке, касающееся моих ORDER BY и HAVING. </p>

--SELECT *
--FROM(
    SELECT InvoiceNo, DescriptionofService, SUM(Price) AS Total_Price,year(invoicedate) AS 'Year', COUNT(DescriptionofService) AS cnt
        ,ROW_NUMBER() OVER (PARTITION BY InvoiceNo ORDER BY COUNT(DescriptionofService) DESC, SUM(Price) DESC) AS rn
        FROM Billing_Lab_Invoice
            WHERE year(Invoicedate) = 2020 
            GROUP BY InvoiceNo, DescriptionofService, year(invoicedate)
            ORDER BY InvoiceNo, cnt DESC, Total_Price DESC
--          ) 
--  HAVING rn <= 10

Вот мои показания, прежде чем я попытаюсь отфильтровать столбец с номером строки

64941452    A   87.50   2020    25  1
64941452    B   62.50   2020    25  2
64941452    C   81.00   2020    18  3
64941452    D   44.00   2020    11  4
......
64941452    E   22.50   2020    3   14

EDIT Это сработало, но не знаю, почему

SET DATEFORMAT DMY
;WITH CTE AS (  
    SELECT InvoiceNo
        , DescriptionofService
        , SUM(Price) AS Total_Price
        ,year(invoicedate) AS 'Year'
        , COUNT(DescriptionofService) AS cnt
        ,ROW_NUMBER() OVER
            (
            PARTITION BY InvoiceNo ORDER BY COUNT(DescriptionofService) DESC, SUM(Price) DESC) AS rn 
        FROM Billing_Lab_Invoice
            WHERE year(Invoicedate) = 2020 
            GROUP BY InvoiceNo, DescriptionofService, year(invoicedate)
            )
SELECT * FROM CTE WHERE [rn] <=10

64941452 A 87,50 2020 25 1 64941452 B 62,50 2020 25 2 64941452 C 81,00 2020 18 3 64941452 D 44,00 2020 11 4 64941452 D 50,00 2020 10 5 64941452 E 161.00 2020 7 6 64941452 F 22.50 2020 6 7 64941452 G 504.352020 5 8 64941452 H 40.00 2020 5 9 64941452 I 40.00 2020 5 10 64946394 A 351.00 2020 78 1 64946394 B 199.50 2020 57 2

1 Ответ

0 голосов
/ 10 июля 2020

Измените исходный SELECT следующим образом:

SELECT x.* FROM (
    
    SELECT TOP 100 PERCENT 
        InvoiceNo, DescriptionofService, SUM(Price) AS Total_Price,year(invoicedate) AS 'Year', COUNT(DescriptionofService) AS cnt
        ,ROW_NUMBER() OVER (PARTITION BY InvoiceNo ORDER BY COUNT(DescriptionofService) DESC, SUM(Price) DESC) AS rn
    FROM Billing_Lab_Invoice
    WHERE year(Invoicedate) = 2020 
    GROUP BY InvoiceNo, DescriptionofService, year(invoicedate)
    ORDER BY InvoiceNo, cnt DESC, Total_Price DESC

) AS x
WHERE x.rn <= 10;

Технически вы не должны иметь возможность ЗАКАЗАТЬ вложенные данные, если вы не укажете TOP. Использование TOP 100 PERCENT позволяет обойти это, возвращая все совпадающие записи.

...