帮我写一段sql,统计各品牌在a公司的合同数和在b公司的合同数
时间: 2024-02-09 16:11:22 浏览: 22
假设有一个名为contracts的表,包含以下字段:
- id: 合同ID
- brand: 合同品牌
- company: 合同所属公司
那么可以使用如下SQL语句统计各品牌在a公司和b公司的合同数:
```
SELECT
brand,
SUM(CASE WHEN company = 'a' THEN 1 ELSE 0 END) AS a_contracts,
SUM(CASE WHEN company = 'b' THEN 1 ELSE 0 END) AS b_contracts
FROM
contracts
GROUP BY
brand;
```
这个SQL语句使用了SUM和CASE WHEN语句,将符合条件的合同数加起来,最终按品牌分组统计。
相关问题
有一张a公司合同表和一张b公司合同表,帮我写一段sql,统计同一个客户在两家公司的合同数
假设a公司的合同表为a_contracts,包含以下字段:
- id: 合同ID
- customer: 客户名称
b公司的合同表为b_contracts,包含以下字段:
- id: 合同ID
- customer: 客户名称
那么可以使用如下SQL语句统计同一个客户在a公司和b公司的合同数:
```
SELECT
customer,
COUNT(DISTINCT a_contracts.id) AS a_contracts,
COUNT(DISTINCT b_contracts.id) AS b_contracts
FROM
a_contracts
JOIN b_contracts ON a_contracts.customer = b_contracts.customer
GROUP BY
customer;
```
这个SQL语句使用了JOIN语句将a_contracts和b_contracts表连接起来,按照customer字段进行匹配,然后统计每个客户在两个表中的合同数。注意使用了DISTINCT关键字去除重复的合同ID。
请帮我写一段计算中位数的SQL代码
假设你要计算一个表中某一列的中位数,可以使用以下SQL代码:
```
SELECT AVG(middle_values) as median
FROM (
SELECT value as middle_values
FROM (
SELECT value,
ROW_NUMBER() OVER (ORDER BY value) as row_num,
COUNT(*) OVER() as total_rows
FROM table_name
) as subquery
WHERE row_num IN (FLOOR((total_rows + 1) / 2), CEIL((total_rows + 1) / 2))
) as middle_query;
```
其中,table_name是你要查询的表名,value是你要计算中位数的列名。这段代码的实现原理是:
1. 使用ROW_NUMBER函数对value列进行排序,得到每个值所在的行号row_num;
2. 使用COUNT函数获取value列的总行数total_rows;
3. 根据中位数的定义,中位数就是排序后第(total_rows+1)/2行的值,或者第(total_rows+2)/2行的值,因此筛选出这两行的值;
4. 对这两个值求平均值,即为中位数。
注意,如果value列有偶数行,那么中位数是两个值的平均数。因此,我们在查询时使用CEIL和FLOOR函数来分别获取这两个值。