環境:mysql數據庫鏈接
需求:想統計數據庫中的設備號,設備狀態,以及設備中子設備的狀態 。
分別為倆個表:
1.設備表:設備號(userId),狀態 (State)
2.自設備表:設備號(userId),子設備類型(E_type), 子設備狀態 (Evalue)
解決方案:
1>使用Sql語句解決
SELECT tabledevice.設備編號, tabledevice.`終端狀態 `, GROUP_CONCAT(tabledevice.硬件狀態) AS '硬件狀態集合' FROM (SELECT e.UserId AS '設備編號', e.State AS '終端狀態 ', CONCAT(eState.E_type, ":", eState.E_value) AS '硬件狀態' FROM equipment e LEFT JOIN equipmentstate eState ON e.UserId = eState.UserId ) AS tabledevice GROUP BY tabledevice.設備編號;
使用Join left 根據 userId鏈接倆個表,並將字段CONCAT(eState.E_type, ":", eState.E_value) 將硬件類型和狀態拼接起來 得到的表數據 重命名為 表tabledevice
然后將表分組 ,分別統計為 UserId State 和狀態集合、
注意 GROUP_CONCAT() 是將當前整個分組集合中的某一列,拼成一行數據。如果未分組,則默認整個表某一列全部拼在一起
2>使用SqlSugar解決
還是自己看文檔不夠認真找了幾遍,沒找到原生函數。
原本以為:會像數據類型轉換一樣,使用 SqlFunc 去轉換數據。結果沒有。哈哈
實際是SqlSugar 可以簡介使用sql函數的。
例如:
List<StudentGroup> list9 = db.Queryable<Student>().Where(c => c.id < 20).GroupBy(it => it.sex).Select<StudentGroup>("Sex,count(*) Count").ToList();
恍然大悟, 一下子清楚了。使用sqlsugar解決上面的數據需求
var res = db.Queryable<Get_Equipment, Get_EquipmentStateDta>((s1, s2) => new object[] { JoinType.Left ,s1.UserId==s2.UserId } ).Select<Get_Equipment>("s1.UserId,State, CONCAT(s2.E_type, \":\", s2.E_value) as hardState"); var data = db.Queryable(res).Select<Get_Equipment>("UserId,State,GROUP_CONCAT(hardState) as hardList " ).GroupBy(s1 => s1.UserId).ToList();
數據過濾方式和使用sql語句基本一致。
原始視圖:
結果如圖示: