首页 > 解决方案 > 从 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 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

但我不知道如何达到我的最终目标。

有人能帮我吗?

标签: sqlsql-servertsql

解决方案


终于找到方法了:

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
;

我不知道这是否是最好的方法,但它似乎有效。


推荐阅读