Итоговая сумма T-SQL - PullRequest
       30

Итоговая сумма T-SQL

0 голосов
/ 28 июня 2019

Рассмотрим таблицу следующей формы (wallet, client, date), где wallet и client равны strings, а date - любая дата до сегодняшнего дня. Скажем, каждый хочет получить текущую сумму как уникальных клиентов, так и клиентов за каждый месяц текущего года, сгруппированных по кошельку и месяцу. Я пробовал несколько вещей, включая разбиение, но просто не могу заставить его работать должным образом.

Результат будет примерно таким:

+------------+---------+------------+---------+
|    Wallet  |  Unique |  Count     | Month   |
+------------+---------+------------+---------+
| Wallet1    | 2       |   5        |   1     | - For < 01022019
+------------+---------+------------+---------+
| Wallet1    | 3       |   7        |   2     | - For < 01032019
+------------+---------+------------+---------+

И так далее. Я перепробовал много вещей, даже разделение, но у меня ничего не получается. Мне удалось сделать это только в нескольких небольших запросах, использующих ГДЕ ниже даты, что абсолютно ужасно, например.

INSERT INTO 
    tmp_tbl_filtered
SELECT
    [Wallet],
    COUNT(DISTINCT [Client]) AS [unique],
    COUNT([Client]) AS [count],
    1 AS [month]
FROM
    tmp_tbl
WHERE [Date] < '20190201'
GROUP BY  [Wallet]
ORDER BY [Wallet]

INSERT INTO 
    tmp_tbl_filtered
SELECT
    [Wallet],
    COUNT(DISTINCT [Client]) AS [unique],
    COUNT([Client]) AS [count],
    2 AS [month]
FROM
    tmp_tbl
WHERE [Date] < '20190301'
GROUP BY  [Wallet]
ORDER BY [Wallet]

Ответы [ 2 ]

0 голосов
/ 28 июня 2019

Я не вижу, где совокупная часть вступает в игру.

SELECT YEAR(date), MONTH(date), Wallet,
       COUNT(DISTINCT [Client]) AS [unique],
       COUNT([Client]) AS [count],
FROM tmp_tbl
WHERE [Date] < '20190301'
GROUP BY YEAR(date), MONTH(date), [Wallet]
ORDER BY Wallet, YEAR(date), MONTH(date)
0 голосов
/ 28 июня 2019

Если я правильно понял

SELECT [Wallet], [month]
   , SUM([unique]) OVER(PARTITION BY [Wallet] ORDER BY [month]) [unique_rt]
   , SUM([count]) OVER(PARTITION BY [Wallet] ORDER BY [month]) [count_rt]
FROM (
    --  group data of the current year 2019 by wallet and month
    SELECT 
        [Wallet],
        DATEPART(month,[Date]) AS [month],
        COUNT(DISTINCT [Client]) AS [unique],
        COUNT([Client]) AS [count]
    FROM
        tmp_tbl
    WHERE [Date] >= '20190101'
    GROUP BY [Wallet], DATEPART(month,[Date])
) t
ORDER BY [Wallet], [month]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...