首页 > 解决方案 > 使用 SQL Server 中的查询在表中使用类似功能的复选框

问题描述

我有一个主表,其中包含多个名称记录,但数量和颜色不同。

TblPrimary : 当前表

id | name    | color | Quan  |
===+=========+=======+=======+
1  | Apple   | Red   | 10    |
2  | Banana  | Yellow| 5     |
3  | Mango   | Yellow| 8     |
4  | Apple   | Green | 20    |
5  | Banana  | Brown | 15    |
6  | Mango   | Orange| 12    |
7  | Mango   | Green |  5    |

这是我的主表,我基本上想要这样的主表中的数据。所以基本上Quan主表是主表中所有个体的总和Quan。主表中的颜色(红色、黄色、棕色);是指示主表中是否存在水果颜色的位。

TblMain:新的预期表

id | Name    | Quan  | Red | Yellow | Brown | Green | Orange |
===+=========+=======+=====+========+=======+=======+========+
1  | Apple   |  30   |  1  |   0    |  0    |   1   |  0     |
2  | Banana  |  20   |  0  |   1    |  1    |   0   |  0     |
3  | Mango   |  25   |  0  |   1    |  0    |   1   |  1     |

我有以下查询,我有分组依据和总和。我无法填充主表的颜色部分。

INSERT INTO TblMain(Name, Quan)
    (SELECT Name, SUM(Quan)
     FROM TblPrimary
     GROUP BY Name)

标签: sqlsql-serversql-server-2008

解决方案


您可以尝试sum在子查询中使用 windows 函数,然后使用条件聚合函数生成您期望的结果。

select  ROW_NUMBER() OVER(ORDER BY name) id,
        name,
    Quan, 
    SUM(CASE WHEN color = 'Red' THEN 1 ELSE 0 END) 'Red',
    SUM(CASE WHEN color = 'Yellow' THEN 1 ELSE 0 END) 'Yellow',
    SUM(CASE WHEN color = 'Brown' THEN 1 ELSE 0 END) 'Brown',
    SUM(CASE WHEN color = 'Green' THEN 1 ELSE 0 END) 'Green',
    SUM(CASE WHEN color = 'Orange' THEN 1 ELSE 0 END) 'Orange'
from (
    SELECT name,
    color,
    SUM(Quan) OVER(PARTITION BY name ORDER BY name) Quan  
    FROM TblPrimary
) t1
group by name,Quan  

sqlfiddle

结果

id  name    Quan    Red Yellow  Brown   Green   Orange
1   Apple   30      1   0       0       1       0
2   Banana  20      0   1       1       0       0
3   Mango   25      0   1       0       1       1

推荐阅读