SQL Server 计数查询

Posted

技术标签:

【中文标题】SQL Server 计数查询【英文标题】:SQL Server Count Query 【发布时间】:2013-01-03 07:39:11 【问题描述】:

我有如下三张表:

Article
No  Storage_code   Type_code
--- ------------   ---------
1   10 00 00          S
2   10 10 00        P
1   10 10 10        S
3   11 00 00        C
1   10 00 00        C
2   11 10 10        P

Storage
Main_Code Division_Code Safe_Code Position_Code   Main_Name
--------- ------------- --------- ------------- -------------
10 00 00     10         00  00              Div1
10 10 00        10          10  00         Div1_Saf1
10 10 10     10         10  10         Div1_Saf1_Pos1
10 10 11        10          10  11              Div1_Saf1_Pos2
10 10 12        10          10  12         Div1_Saf1_Pos3
10 11 00        10          11  00         Div1_Saf2
10 11 10        10          11  10         Div1_Saf2_Pos1
10 11 11     10         11  11              Div1_Saf2_Pos2
10 11 12        10           11 12              Div1_Saf2_Pos3
11 00 00        11           00 00              Div2
11 10 00     11         10  00         Div2_Saf1
11 10 10        11          10  10         Div2_Saf1_Pos1
11 10 11        11          10  11         Div2_Saf1_Pos2
11 10 12        11          10  12         Div2_Saf1_Pos3
11 11 00        11          11  00         Div2_Saf2
11 11 10        11          11  10         Div2_Saf2_Pos1
11 11 11        11          11  11         Div2_Saf2_Pos2
11 11 12        11          11  12         Div2_Saf2_Pos3

Types
Code        Name
--------        --------
C       Cards
P       Plates
S       Stickers    

我想要一个选择的结果如下:

Main_Code    Division_Code Safe_Code Position_Code Main_Name    Cards Plates Stickers Total
----------------------------------------------------------------------------------------
10 00 00          10         00 00    Div1      1    1       2     4
10 10 00          10            10  00    Div1_Saf1 0    1      1      2
10 10 10          10            10  10    Div1_Saf1_Pos1    0    0      1      1
11 00 00          11            00  00    Div2      1    1      0      2
11 10 00          11            10  00    Div2_Saf1 0    1      0      1
11 10 10          11            10  10    Div2_Saf1_Pos1    0    1      0      1

谁能尽快帮助我。

【问题讨论】:

我已开始编辑您的问题,以便我们查看表格。但我不会做所有的清理工作。发布代码或应具有固定布局的项目时,请使用 代码示例按钮。并使用预览区域,以便您可以查看您的问题实际上会是什么样子。原来的问题不可读。 您还需要说明CardsPlatesStickers 列是如何计算的。 你想要的是一个透视查询。您可以使用 case 语句和聚合或使用 PIVOT 子句手动执行此操作。这个网站上有很多很多的例子,你可以搜索。 【参考方案1】:

您正在寻找将行转为列,试试这个:

SELECT
  s.[Main_Code],
  s.Division_Code,
  s.Safe_Code,
  s.Position_Code,
  s.Main_Name,
  SUM(CASE WHEN t.Name ='Cards' THEN 1 ELSE 0 END) AS Cards, 
  SUM(CASE WHEN t.Name ='Plates' THEN 1 ELSE 0 END) AS Plates, 
  SUM(CASE WHEN t.Name ='Stickers' THEN 1 ELSE 0 END) AS Stickers,
  COUNT(t.Name) AS Total
FROM Storage s
INNER JOIN Article a ON a.Storage_code = s.[MainCode]
INNER JOIN Types   t ON a.Type_code = t.Code
GROUP BY s.Main_Code,
         s.Division_Code,
         s.Safe_Code,
         s.Position_Code,
         s.Main_Name;

【讨论】:

以上是关于SQL Server 计数查询的主要内容,如果未能解决你的问题,请参考以下文章

没有顺序的 SQL Server 计数查询

如何在一个 SQL Server 查询中组合不同的计数

带有分页和计数的 SQL Server 查询

SQL Server SQL性能优化之--pivot行列转换减少扫描计数优化查询语句

在 SQL Server 查询中有条件地应用多个计数

SQL Server 同一查询中的多个计数 - CosmosDB