Нахождение суммы всех записей с группировкой по - PullRequest
0 голосов
/ 15 мая 2018

Я строю SQL-запрос В этом запросе должны отображаться данные о самых популярных платных поставщиках и сведения о платежах по каждому поставщику за месяц, а также общая сумма платежей за поставщика

.
VendorTable
Vendor varchar(100)
PayDate Date
Amt int

-

Vendor   PayDate    Amt
Vendor1  01-Jan-15  $70
Vendor1  13-Jan-15  $30
Vendor2  04-Mar-16  $180
Vendor2  21-Mar-16  $70
Vendor3  17-Sep-16  $300

Пример конечного результата

Vendor   Month   MonthlyAmt   TotalAmt
Vendor1  Jan-15  $100         $870
Vendor2  Mar-16  $250         $900
Vendor3  Sep-16  $300         $720
Vendor1  Dec-16  $140         $870
Vendor2  Feb-17  $210         $900
Vendor1  Apr-17  $400         $870
Vendor3  Aug-17  $420         $900
Vendor2  Nov-17  $330         $900
Vendor2  Mar-18  $110         $900
Vendor1  May-18  $230         $870

Мой SELECT выглядит так

SELECT TOP 10 Vendor, Month(PayDate) + '-' + Year(PayDate), SUM(Amt), ????????
FROM VendorsTable
GROUP BY Vendor, Month(PayDate) + '-' + Year(PayDate)
ORDER BY ???????? DESC

не уверен, как найти сумму по всем платежам для поставщика

Ответы [ 4 ]

0 голосов
/ 15 мая 2018

это полезно .?

SELECT DISTINCT Vendor
      ,Replace(RIGHT(CONVERT(NVARCHAR(9), paydate, 6), 6), ' ', '-') AS Month
      ,SUM(Amt) OVER(Partition by Vendor,Replace(RIGHT(CONVERT(NVARCHAR(9), paydate, 6), 6), ' ', '-')) As MonthlyAmt,
       SUM(Amt) OVER(Partition by Vendor) AS TotalAmt
FROM VendorTable  

С заказом по предложению:

;with cte
 AS
 (
   SELECT DISTINCT Vendor,Replace(RIGHT(CONVERT(NVARCHAR(9), paydate, 6), 6), ' ', '-') AS Month
     ,SUM(Amt) OVER(Partition by Vendor,Replace(RIGHT(CONVERT(NVARCHAR(9), paydate, 6), 6), ' ', '-')) As MonthlyAmt,
     SUM(Amt) OVER(Partition by Vendor) AS TotalAmt
  FROM VendorTable   
 )

 select Vendor,Month,MonthlyAmt,TotalAmt
 FROM cte 
 ORDER BY CAST('20'+SUBSTRING(Month,5,2) + '-' +SUBSTRING(Month,0,4) + '-' + '01' AS DATE)

Ссылка SQL Fiddle: http://sqlfiddle.com/#!18/26ef4/99/0

0 голосов
/ 15 мая 2018

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

with samplevalues as
(
select
    *
from
    (values 
        ('Vendor1', 'Jan-15', 100, 870),
        ('Vendor2', 'Mar-16', 250,  900),
        ('Vendor3', 'Sep-16',   300, 720),
        ('Vendor1', 'Dec-16',   140, 870),
        ('Vendor2', 'Feb-17',   210, 900),
        ('Vendor1', 'Apr-17',   400, 870),
        ('Vendor3', 'Aug-17',   420, 900),
        ('Vendor2', 'Nov-17',   330, 900),
        ('Vendor2', 'Mar-18',   110, 900),
        ('Vendor1', 'May-18 ',  230, $870)
    ) T(Vendor, [Month], MonthlyAmt, TotalAmt)
)
select
    Vendor, [Month], SUM(MonthlyAmt) OVER (PARTITION BY Vendor)
from
    samplevalues

, которая должна делать именно то, что вам нужно.

Дополнительная информация или предложение OVER здесь:

https://docs.microsoft.com/en-us/sql/t-sql/queries/select-over-clause-transact-sql?view=sql-server-2017

0 голосов
/ 15 мая 2018

Попробуйте это ...

SELECT t1.vendor, 
       Replace(RIGHT(CONVERT(NVARCHAR(9), t1.paydate, 6), 6), ' ', '-') AS PayDate, 
       Sum(t1.amt)                                                      AS MonthlyAmt, 
       Max(t2.totalamt)                                                 AS TotalAmt 
FROM   tablename t1 
       INNER JOIN (SELECT vendor, Sum(amt) AS TotalAmt 
                   FROM   tablename 
                   GROUP  BY vendor) t2 
               ON t1.vendor = t2.vendor 
GROUP  BY t1.vendor, Replace(RIGHT(CONVERT(NVARCHAR(9), t1.paydate, 6), 6), ' ', '-') 

Вывод
Обратите внимание, что эти примеры данных отличаются от ваших данных

+---------+---------+------------+----------+
| vendor  | PayDate | MonthlyAmt | TotalAmt |
+---------+---------+------------+----------+
| Vendor1 | Jan-15  |        100 |      110 |
| Vendor1 | Jan-16  |         10 |      110 |
| Vendor2 | Mar-16  |        250 |      250 |
| Vendor3 | Sep-16  |        300 |      300 |
+---------+---------+------------+----------+

Топ 10 поставщиков и месяцев

SELECT TOP 10 t1.vendor, 
              Replace(RIGHT(CONVERT(NVARCHAR(9), t1.paydate, 6), 6), ' ', '-') AS PayDate, 
              Sum(t1.amt) AS MonthlyAmt, 
              Max(t2.totalamt) AS TotalAmt 
FROM   tablename t1 
       INNER JOIN (SELECT vendor, Sum(amt) AS TotalAmt 
                   FROM   tablename 
                   GROUP  BY vendor) t2 
               ON t1.vendor = t2.vendor 
GROUP  BY t1.vendor, Replace(RIGHT(CONVERT(NVARCHAR(9), t1.paydate, 6), 6), ' ', '-') 
ORDER  BY monthlyamt DESC 

Вывод

+---------+---------+------------+----------+
| vendor  | PayDate | MonthlyAmt | TotalAmt |
+---------+---------+------------+----------+
| Vendor3 | Sep-16  |        300 |      300 |
| Vendor2 | Mar-16  |        250 |      250 |
| Vendor1 | Jan-15  |        100 |      110 |
| Vendor1 | Jan-16  |         10 |      110 |
+---------+---------+------------+----------+

Ссылка
- http://www.sql -server-helper.com / tips / date-format.ASPX

0 голосов
/ 15 мая 2018

Похоже, вам нужен параметр ROLLUP:

SELECT TOP 10 Vendor, Month(PayDate) + '-' + Year(PayDate), SUM(Amt), ????????
FROM VendorsTable
GROUP BY Vendor, Month(PayDate) + '-' + Year(PayDate)
WITH ROLLUP
ORDER BY ???????? DESC

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

https://docs.microsoft.com/en-us/sql/t-sql/queries/select-group-by-transact-sql?view=sql-server-2017

...