簡體   English   中英

從數據庫中的一列 COUNT 多個值,然后拆分到我的表中的不同列中

[英]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]

http://sqlfiddle.com/#!18/0aef98/8

看起來您在這里需要條件聚合。 您可以通過將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM