![](/img/trans.png)
[英]How to get data by mutiple values on one column with different values on other columns from database in Entity Framework?
[英]COUNT multiple values from one column in the database and then split into different columns in my table
我在試圖弄清楚如何從我的 SQL 數據庫中的一列中計算多個值,然后在我的 DataGrid 表中顯示結果時遇到了麻煩。
這是我的表
<DataGrid.Columns>
<DataGridTextColumn Header="User" Binding="{Binding UserName}" Width="200"/>
<DataGridTextColumn Header="Jobs Booked" Binding="{Binding JobsCount}" Width="200"/>
<DataGridTextColumn Header="Plumbing" Binding="{Binding PlumbingCount}" Width="200"/>
<DataGridTextColumn Header="Drainage" Binding="{Binding DrainsCount}" Width="200"/>
</DataGrid.Columns>
這是我當前嘗試顯示管道計數的查詢
string query = @"
SELECT
COUNT(ID) AS JobsCount,
UserName,
COUNT(JobType) As PlumbingCount
FROM tblJobs
WHERE JobType = 'Plumbing'
AND CAST(CreatedOn AS DATE) = CAST(GETDATE() AS DATE)
Group by UserName
ORDER BY COUNT(ID) DESC
";
在我的數據庫中,總計是;
丹 - 用戶名
4 - 預訂的工作總數
3 - 管道
1 - 排水
我當前的查詢僅顯示管道的總工作量。
我需要表格來顯示相關計數,基於它的管道或排水系統是否顯示在我的數據庫中“JobType”下的同一列中,然后是該用戶的總工作量。
您可以使用PIVOT
。 PIVOT
子句根據給定SELECT
結構中的預期數據創建命名列。 這與簡單的交叉表查詢具有相同的輸出,但具有一些靈活性,可以進行更詳細的分析。
看起來您需要像這樣使用PIVOT
:
SELECT username,
jobtotal = SUM([plumbing]+[drainage]),
[plumbing],
[drainage]
FROM
(
SELECT
username,
1 AS jobcount,
jobtype
FROM jobs
WHERE createdon >= CAST(CAST(GETDATE() AS date) AS datetime)
AND created < CAST(DATEADD(day, 1, CAST(GETDATE() AS date)) AS datetime)
) ps
PIVOT
(
SUM(jobcount)
FOR jobtype IN ([plumbing], [drainage])
) AS pvt
GROUP BY username, [plumbing], [drainage]
看起來您在這里需要條件聚合。 您可以通過將CASE
放在聚合中來實現。
進一步的要點:
COUNT(something)
只計算每個非空值,它不計算唯一值。 為此,您需要COUNT(DISTINCT something)
CAST(CreatedOn AS DATE) = CAST(GETDATE() AS DATE)
對服務器來說不容易優化,最好給出明確的開始和結束范圍SELECT
UserName,
COUNT(*) AS JobsCount,
COUNT(CASE WHEN JobType = 'Plumbing' THEN 1 END) As PlumbingCount,
COUNT(CASE WHEN JobType = 'Drainage' THEN 1 END) As DrainageCount
FROM tblJobs
WHERE
AND CreatedOn >= CAST(CAST(GETDATE() AS date) AS datetime)
AND CreatedOn < CAST(DATEADD(day, 1, CAST(GETDATE() AS date)) AS datetime)
GROUP BY UserName
ORDER BY COUNT(*) DESC;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.