Извините за замысловатый заголовок!
У меня есть таблица с именем 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 ответов
Я смог получить желаемый результат, используя 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
Используйте «с» или несколько встроенных представлений, то есть запросы в предложении 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
Попробуйте что-то вроде этого:
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
Попробуй это
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
Этот скрипт поможет
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
Похожие вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.