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

У меня есть таблица с именем 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, чтобы увидеть количество заказов на одного поставщика на одного клиента, но тогда я не могу отобразить% от общего количества заказов на одного клиента в одной и той же таблице, потому что общий показатель бронирования не доступно для меня. Я не могу решить это, какие-либо предложения?

0
adohertyd 2 Май 2019 в 19:28

5 ответов

Лучший ответ

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

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

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
reidh.olsen 2 Май 2019 в 16:42

Используйте «с» или несколько встроенных представлений, то есть запросы в предложении 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
1
Saad Ahmad 2 Май 2019 в 16:39

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

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

Живая Демо.

1
Outman 2 Май 2019 в 18:43

Попробуй это

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
Eric 2 Май 2019 в 20:08

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

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
mkRabbani 2 Май 2019 в 16:55