sql - 从 SQL Server 中的其他组合创建列
问题描述
我有一张这样的桌子:
产品 | 版本 | 目标 |
---|---|---|
一个 | 1.2.3 | X |
一个 | 1.2.3 | 是 |
一个 | 1.2.4 | X |
一个 | 1.2.4 | Z |
一个 | 1.2.5 | X |
一个 | 1.2.5 | 是 |
一个 | 1.2.5 | Z |
一个 | 1.3.0 | X |
一个 | 1.3.0 | 是 |
一个 | 1.3.1 | X |
一个 | 1.3.2 | 是 |
一个 | 1.3.2 | X |
一个 | 1.3.2 | Z |
我需要一个表,其中包含每个产品的版本部署次数(X 和 Y 和 Z)、(X 和 Y 但不是 Z)、(X 和 Z 但不是 X)、(X 但不是Y 而不是 Z) 和总数。
注意:
- 目标不止 X、Y、Z,但我只对那些感兴趣。
- 一个版本可以在同一个目标中多次部署
就像是:
产品 | X_Y_Z | X_Y | X_Z | X_only | 全部的 |
---|---|---|---|---|---|
一个 | 1 | 3 | 2 | 0 | 6 |
我找到了Pivot函数,该函数允许我按部署配置按单个环境分组列,并带有以下查询:
SELECT
Product,
COUNT(Version) AS Versions,
IIF(X > 0, 1, 0) AS X,
IIF(Y > 0, 1, 0) AS Y,
IIF(Z > 0, 1, 0) AS Z
FROM
(SELECT
ID,
Product,
Version,
Target
FROM
Delivery
GROUP BY
ID, Product, Version, Target) AS src
PIVOT
(COUNT(ID) FOR Target IN (X, Y, Z)) AS pivotTable
WHERE
X > 0
GROUP BY
PROJ_LABEL,
IIF(X > 0, 1, 0) AS X,
IIF(Y > 0, 1, 0) AS Y,
IIF(Z > 0, 1, 0) AS Z;
这给了我:
产品 | 版本 | X | 是 | Z |
---|---|---|---|---|
一个 | 1 | 1 | 1 | 1 |
一个 | 3 | 1 | 1 | 0 |
一个 | 2 | 1 | 0 | 1 |
但我不知道如何达到我的最终目标。
有人能帮我吗?
解决方案
终于找到方法了:
SELECT
Product,
SUM(X_Y_Z) AS 'X_Y_Z',
SUM(X_Y) AS 'X_Y',
SUM(X_Z) AS 'X_Z',
SUM(X) AS 'X only',
SUM(X_Y_Z) + SUM(X_Y) + SUM(X_Z) + SUM(X) AS Total
FROM (
SELECT
Product,
X_Y_Z*value AS X_Y_Z,
X_Y*value AS X_Y,
X_Z*value AS X_Z,
X*value AS X
FROM (
SELECT
Product,
COUNT(Version) AS Versions,
IIF(X > 0, 1, 0) AS X,
IIF(Y > 0, 1, 0) AS Y,
IIF(Z > 0, 1, 0) AS Z
FROM
(SELECT
ID,
Product,
Version,
Target
FROM
Delivery
GROUP BY
ID, Product, Version, Target) AS src
PIVOT
(COUNT(ID) FOR Target IN (X, Y, Z)) AS pivotTable
WHERE
X > 0
GROUP BY
Product,
IIF(X > 0, 1, 0) AS X,
IIF(Y > 0, 1, 0) AS Y,
IIF(Z > 0, 1, 0) AS Z;
) AS tmp
) AS tmp2
GROUP BY Product
ORDER BY 1 ASC
;
我不知道这是否是最好的方法,但它似乎有效。
推荐阅读
- swift - Swift:如何从 Sensortag 2.0 设备恢复数据
- javascript - 加载源时从 localstorage 加载 angular fullcalendar v4 事件
- java - java Streams:收集考虑流是空的
- c# - 在 orderby Linq 中检查对象 null
- c# - 如何使用 Sharpmap 将经度和纬度映射到 WGS84?
- php - 如何访问返回的 json 值
- java - 从java执行bash脚本
- java - Spring Boot在测试中没有自动装配类
- vue.js - vue 路由在 chrome 中不起作用...在 IE 和 firefox 中运行良好
- multithreading - Wildfly 10:尝试实现 Java 并发实用程序时出错