SQL Server Показать общее значение в отдельном столбце, где группировка по уже разбивает итоговые - PullRequest
0 голосов
/ 02 мая 2019

Извините за замысловатый заголовок!

У меня есть таблица с именем bookings:

|Booking_id|Client_Id|Supplier_id|
----------------------------------
|    1     |    8    |    123    |
|    2     |    54   |    354    |
|    3     |    54   |    100    |
|    4     |    8    |    123    |
|    5     |    79   |    64     |
|    6     |    123  |    354    |
|    7     |    8    |    354    |
|    8     |    54   |    100    |
|    9     |    123  |    354    |
|    10    |    22   |    123    |

Я должен получить% от общего количества заказов на одного поставщика на клиента

Таким образом, вывод должен быть:

% of total bookings per supplier per client

|Client_id|Supplier_id|NumOfBookings|%_ofClientBookings|
--------------------------------------------------------
|    8    |    123    |      2      |         66       |
|    8    |    354    |      1      |         33       |
|    22   |    123    |      1      |         100      |
|    54   |    354    |      1      |         50       |
|    54   |    100    |      1      |         50       |
|    79   |    64     |      1      |         100      |
|    123  |    354    |      2      |         100      |

У меня следующий запрос:

SELECT Client_id, COUNT(Booking_id) As NumOfBookings, Supplier_id, 
FROM Booking
GROUP BY Client_id, Supplier_id
ORDER BY Client_id asc, NumOfBookings desc

Мне нужно указать GROUP_BY Supplier_id и Client_id, чтобы увидеть количество заказов на одного поставщика на одного клиента, но тогда я не могу отобразить% от общего количества заказов на одного клиента в одной и той же таблице, так как общий показатель бронирования не равен ' т для меня. Я не могу решить это, какие-либо предложения?

Ответы [ 5 ]

1 голос
/ 02 мая 2019

Попробуйте что-то вроде этого:

SELECT Client_id,
COUNT(Booking_id) As NumOfBookings,
FLOOR(100*(CAST(COUNT(Booking_id) AS FLOAT)/(SELECT COUNT(Booking_id) FROM Booking bb 
WHERE bb.Client_id = b.Client_id))),
Supplier_id
FROM Booking b
GROUP BY Client_id, Supplier_id
ORDER BY Client_id asc, NumOfBookings desc

Live Demo.

1 голос
/ 02 мая 2019

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

SELECT Client_id, NumOfBookings, Supplier_id
, (CAST(NumOfBookings AS DECIMAL(5, 2)) / SUM(NumOfBookings) OVER(PARTITION BY Client_id)) * 100 AS [%_ofClientBookings]
FROM (
    SELECT Client_id, COUNT(Booking_id) As NumOfBookings, Supplier_id
    FROM Booking
    GROUP BY Client_id, Supplier_id
) a
ORDER BY Client_id asc, NumOfBookings desc
1 голос
/ 02 мая 2019

Мне удалось получить желаемый результат, используя derived tables, один для количества бронирований поставщиком и клиентом и один для общего количества бронирований клиентом.

Ниже приведен код, который вы использовали, выпотребуется заменить #table вашей таблицей и игнорировать таблицу вставок / создания.

IF OBJECT_ID('tempdb..#table') IS NOT  NULL
BEGIN
    DROP TABLE #table
END

CREATE TABLE #table(Booking_id int, Client_id int, supplier_id int)

insert into #table values(1,8,123)
insert into #table values(2,54,354)
insert into #table values(3,54,100)
insert into #table values(4,8,123)
insert into #table values(5,79,64)
insert into #table values(6,134,354)
insert into #table values(7,8,354)
insert into #table values(8,54,100)
insert into #table values(9,123,354)
insert into #table values(10,22,123)

SELECT NoB.Client_id,NoB.supplier_id,NoB.NumOfBookings, (NoB.NumOfBookings/(NULLIF(Tot.NumOfBookings,0) *1.0)) *100 FROM
    (
        SELECT Client_id, COUNT(Booking_id) As NumOfBookings, Supplier_id 
        FROM #table
        GROUP BY Client_id, Supplier_id

    ) NoB JOIN
    (
        SELECT Client_id, COUNT(Booking_id) As NumOfBookings 
        FROM #table
        GROUP BY Client_id

    ) Tot on Tot.Client_id=NoB.Client_id
1 голос
/ 02 мая 2019

Этот скрипт поможет -

SELECT A.Client_Id,A.Supplier_id,A.C NumOfBookings,
CAST((A.C*1.0)/B.C*100.00 AS INT) AS Percentage
FROM 
(
    SELECT Client_Id,Supplier_id ,COUNT(Booking_id) C
    FROM your_table
    GROUP BY Client_Id,Supplier_id 

)A
INNER JOIN 
(
    SELECT Client_Id,COUNT(Booking_id) C
    FROM your_table
    GROUP BY Client_Id
)B
ON A.Client_Id = B.Client_Id
1 голос
/ 02 мая 2019

Используйте «с» или несколько встроенных представлений, то есть запросы в предложении from. С проще.

With bookbyclient as (select that has total for client.  Key for result is client)
Now select like you have but join to bookbyclient.  In select list divide booking value here by the total from above to get percent
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...