Ⅰ sql分組統計後分別顯示前幾條記錄
首先,該問題對應的SQL如下
select 采購類別,客戶,訂貨總額
from (select采購類別,客戶,訂貨總額,
row_number() over(partition by 采購類別 order by 訂貨總額 desc) rn
from table_name) a
where rn<=2
;
其次,常用資料庫比如Oracle和Sqlserver都有特定函數完成分組排序的功能,如果需要顯示並列的情況可以用下面另外的2個.
分別有3個類似函數:
row_number() over
這個函數不需要考慮是否並列,哪怕根據條件查詢出來的數值相同也會進行連續排名。也是最常用的函數,排序結果類似於1,2,3,4,5
rank() over
查出指定條件後進行一個排名,但是有一個特點。假如是對學生排名,那麼實用這個函數,成績相同的兩名是並列。排序結果類似於1,2,2,4,5
dense_rank() over
比較特殊,排序結果類似於1,2,2,3,4
Ⅱ SQL語句如何取前10條,10-30條記錄
常用幾種資料庫,取前10條記錄的sql語句寫法。
access:
select top (10) * from table1 where 1=1
db2:
select column from table where 1=1 fetch first 10 rows only
mysql:
select * from table1 where 1=1 limit 10
sql server:
讀取前10條:select top (10) * from table1 where 1=1
讀取後10條:select top (10) * from table1 order by id desc
oracle:
select * from table1 where rownum<=10
取10-30條的記錄:
select top 20 * from 表名 where id not in(select top 10 id from 表名)
(2)Sql針對三個類別分別統計前十擴展閱讀:
使用SQL從表中取記錄。
SQL的主要功能之一是實現資料庫查詢。如果你熟悉Internet 引擎,那麼你已經熟悉查詢了。你使用查詢來取得滿足特定條件的信息。
多數Internet 引擎允許邏輯查詢。在邏輯查詢中,你可以包括特殊的運算符如AND、OR和NOT,你使用這些運算符來選擇特定的記錄。
如果需要擴展查詢的結果,可以使用邏輯操作符OR。例如,如果執行一個搜索,搜索所有的其描述中包含Active Sever Pages OR SQL的站點,收到的列表中將包括所有其描述中同時包含兩個表達式或其中任何一個表達式的站點。
如果想從搜索結果中排除特定的站點,可以使用NOT。例如,查詢「Active Sever Pages 」AND NOT 「SQL」將返回一個列表,列表中的站點包含Active Sever Pages,但不包含SQL。當必須排除特定的記錄時,可以使用NOT。
用SQL執行的查詢與用Internet搜索引擎執行的搜索非常相似。 當執行一個SQL查詢時,通過使用包括邏輯運算符的查詢條件,你可以得到一個記錄列表。此時查詢結果是來自一個或多個表。
Ⅲ sql 統計銷量 前10
這樣建表有很大問題 數據冗餘 應該建立兩個表 一個商品表 里邊有 id titil price 第二張是銷售表 有 商品對應的id state count(銷售數量) 讓賣出一個件產品 就更新count+1; 用update語句 如果按照你的表 每賣出一個就要添加一條記錄 每條記錄出了時間不一樣 其他都一樣
Ⅳ 用SQL如何統計獲取結果中從多到少的前10個
例表tab_test ,數量列名:sl
select top 10 * from tab_test order by d desc
語句執行,先將結果集按 sl 的降序 排序,然後使用 top 10 選擇前10行數據。
如果單一用戶有多條記錄,那需要將用戶分組,計算數量
例表tab_test ,數量列名:sl,用戶列名: user
select top 10 user,sum(sl) as 'sl_xj' from tab_test group by user order by sl_xj desc
Ⅳ SQL問題,分類統計
一個通用的針對單表用的交叉表存儲過程
傳入幾個參數:
@TableName varchar(16) --表名
@縱軸 varchar(20) --交叉表最左面的列
@橫軸 varchar(10) --交叉表最上面的列
@表體內容 numeric(10,2) --交叉表的數字內容
@是否加橫向合計 bit --為1時在交叉表橫向最右邊加橫向合計
@是否家縱向合計 bit --為1時在交叉表縱向最下邊加縱向合計
思路:
1、取得disinct 橫軸欄位 後,取得唯一的橫軸欄位表
2、根據橫軸的唯一欄位內容,循環整個表後動態生成一個Sql語句,
像select 科室,sum(case(橫軸欄位表.....).......) from @tablename group
by 科室
exec 生成的Sql
3、根據參數是否合計,分別加合計欄位,求出橫向合計和縱向合計
您看這個思路行嗎?但有一個限制就是橫軸不能太多,多了Sql可能會超過8000字元。一般不會這么多,如果太多就把橫軸變為縱軸,總之取欄位較少的做橫軸,這個就是傳參數時的問題了。
如果弄成了,這個在一定的范圍內應該是比較通用的了。對不!
這是我的思路,具體寫的時候,感覺到Sql的組合比較麻煩,能幫我寫一下嗎?
============================================================
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_qry]') and OBJECTPROPERTY(id, N'IsProcere') = 1)
drop procere [dbo].[p_qry]
GO
/*--生成交叉表的簡單通用存儲過程
根據指定的表名,縱橫欄位,統計欄位,自動生成交叉表
並可根據需要生成縱橫兩個方向的合計
注意,橫向欄位數目如果大於縱向欄位數目,將自動交換縱橫欄位
如果不要此功能,則去掉交換處理部分
--鄒建 204.06--*/
/*--調用示例
exec p_qry 'syscolumns','id','colid','colid','name like ''s%''',1,1
--*/
create proc p_qry
@TableName sysname, --表名
@縱軸 sysname, --交叉表最左面的列
@橫軸 sysname, --交叉表最上面的列
@表體內容 sysname, --交叉表的數數據欄位
@條件 varchar(1000),--查詢的處理條件
@是否加橫向合計 bit, --為1時在交叉表橫向最右邊加橫向合計
@是否家縱向合計 bit --為1時在交叉表縱向最下邊加縱向合計
as
declare @s nvarchar(4000),@sql varchar(8000)
--規范條件
set @條件=case when @條件<>'' then ' where ('+@條件+')' else '' end
--判斷橫向欄位是否大於縱向欄位數目,如果是,則交換縱橫欄位
set @s='declare @a sysname
if(select case when count(distinct ['+@縱軸+'])from ['+@TableName+'] '+@條件+')=1
select @a=@縱軸,@縱軸=@橫軸,@橫軸=@a'
exec sp_executesql @s
,N'@縱軸 sysname out,@橫軸 sysname out'
,@縱軸 out,@橫軸 out
--生成交叉表處理語句
set @s='
set @s=''''
select @s=@s+'',[''+cast(['+@橫軸+'] as varchar)+'']=sum(case ['+@橫軸
+'] when ''''''+cast(['+@橫軸+'] as varchar)+'''''' then ['+@表體內容+'] else 0 end)''
from ['+@TableName+']
'+@條件+'
group by ['+@橫軸+']'
exec sp_executesql @s
,N'@s varchar(8000) out'
,@sql out
--是否生成合計欄位的處理
declare @sum1 varchar(200),@sum2 varchar(200),@sum3 varchar(200)
select @sum1=case @是否加橫向合計
when 1 then ',[合計]=sum(['+@表體內容+'])'
else '' end
,@sum2=case @是否家縱向合計
when 1 then '['+@縱軸+']=case grouping(['
+@縱軸+']) when 1 then ''合計'' else cast(['
+@縱軸+'] as varchar) end'
else '['+@縱軸+']' end
,@sum3=case @是否家縱向合計
when 1 then ' with rollup'
else '' end
--生成交叉表
exec('select '+@sum2+@sql+@sum1+'
from ['+@TableName+']
'+@條件+'
group by ['+@縱軸+']'+@sum3)
go
exec p_qry 'test','name','subject','source','source>70',0,0
Ⅵ sql 查詢每個班前十名
表建的很不合理啊
首先,班級要一張表
學生信息要一張表
成績一張表
建資料庫要有遵守三條原則啊,不然也很不方便查詢
你這題,用分組也沒辦查. 樓上兩位完全就是騙分的...沒一個正確的
就說一樓的這句SELECT TOP 10 * FROM 表名 WHERE 條件 ORDER BY 成績 DESC ...請問條件是什麼?
再說二樓的selet top 10 * from 學生表 order by 成績 desc
你這查出來的只是所有班所有前十名的成績.而不是每個班的前十名
如果表只有一張,只能分班查...比如班級列叫calss,其中有一個班級Classone
select top 10 * from 表名 where class='Classone' order by 成績
Ⅶ SQL 前幾個的統計統計
select top 10 sum(列) from 表
select top 20 sum(列) from 表
select top 30 sum(列) from 表
top 後面的數字代表只取前多少行 sum就是加
Ⅷ SQL統計出所有科目總分最高的前10位
你好, 很高興為你解答
因為不太清楚你的科目與總分是在一個表中, 還是兩個, 如果假設是一個的化
表中有科目 和總分, 那樣科目的ID因該是主鍵
select top 10 科目,總分 from 科目表 order by 總分 desc
希望有所幫助
Ⅸ SQL 分類統計
select a.nums,a.groups from
(
select count(aa) as Nums,'0~10' as Groups from table_cc where aa between 0 and 10
union
select count(aa) as Nums,'10~20' as Groups from table_cc where aa between 10 and 20
union
select count(aa) as Nums,'20~30' as Groups from table_cc where aa between 20 and 30
)a
說明:你是不是想得到這樣的結果
Ⅹ 問一下SQL分類匯總並排行的問題
num1後面多了個逗號
order by num1 desc 換成 order by a desc 試試