在SQL列中添加由其他列确定的特定值

在SQL列中添加由其他列确定的特定值,sql,sql-server,Sql,Sql Server,我有一个基于标签确定不同值的数据库。 标签确定其是否为豁免值。 例如,2=非豁免,3=豁免。如果我运行查询,我的结果如下所示 |Name |ExemptionStatus |Total Value| |X |2 |100 | |X |3 |200 | 我的问题是 SELECT NAME, EXEMPTIONSTATUS SUM(TOTA

我有一个基于标签确定不同值的数据库。 标签确定其是否为豁免值。 例如,2=非豁免,3=豁免。如果我运行查询,我的结果如下所示

    |Name  |ExemptionStatus |Total Value|
    |X     |2               |100        |  
    |X     |3               |200        |
我的问题是

    SELECT NAME, EXEMPTIONSTATUS
           SUM(TOTAL_VALUE) AS 'TOTAL VALUE'
    FROM ORDER_ACCOUNT JOIN ACCOUNT_INVOICE
    WHERE ORDER_ACCOUNT.DATE BETWEEN 'M/D/YEAR' AND 'M/D/YEAR'
    GROUP BY NAME, EXEMPTIONSTATUS
    ORDER BY NAME ASC   
如何让查询为值创建新列,例如:

    |Name  |NON EXEMPT VALUE|EXEMPT VALUE|
    |X     |100             |200         |

我只是不知道如何对它进行排序,无论它是否在我的Where子句中。

在SUM中使用CASE语句,只对NON EXPLOTE进行总计,然后选择EXPLOTE,并将它们作为单独的列。类似于以下内容,可能需要将TOTAL_值添加到GROUP BY,或删除ExcemptionStatus

SELECT
NAME
,SUM(CASE WHEN EXEMPTIONSTATUS = 2 THEN TOTAL_VALUE ELSE 0 END) AS 'NON EXEMPT VALUE'
,SUM(CASE WHEN EXEMPTIONSTATUS = 3 THEN TOTAL_VALUE ELSE 0 END) AS 'EXEMPT VALUE'
FROM ORDER_ACCOUNT JOIN ACCOUNT_INVOICE
WHERE ORDER_ACCOUNT.DATE BETWEEN 'M/D/YEAR' AND 'M/D/YEAR'
GROUP BY NAME, EXEMPTIONSTATUS
ORDER BY NAME ASC 
编辑:下面的新代码将新列添加到现有表中。您将需要用表替换测试,但我相信这将得到您想要的

SELECT
NAME,
EXEMPTIONSTATUS
,[TOTAL_VALUE]
,(SELECT SUM(CASE WHEN EXEMPTIONSTATUS = 2 THEN TOTAL_VALUE ELSE 0 END) FROM #Test t WHERE t.NAME = NAME) 'NON EXEMPT VALUE'
,(SELECT SUM(CASE WHEN EXEMPTIONSTATUS = 3 THEN TOTAL_VALUE ELSE 0 END) FROM #Test t WHERE t.NAME = NAME) 'EXEMPT VALUE'
FROM #Test
这给了我以下输出

| NAME | EXEMPTIONSTATUS | TOTAL_VALUE | NON EXEMPT VALUE  | EXEMPT VALUE  |
| X    | 2               | 100         | 100               | 200           |
| X    | 3               | 200         | 100               | 200           |

假设您的表结构如下所示:

CREATE TABLE tab(ID int, Name nvarchar(20), ExemptionStatus int, TotalValue int);
INSERT INTO tab(ID, Name, ExemptionStatus, TotalValue) values (1, 'X', 2, 100);
INSERT INTO tab(ID, Name, ExemptionStatus, TotalValue) values (2, 'X', 3, 200);
   ID   Name   ExemptionStatus   TotalValue
    1     X        2                100
    2     X        3                200
   ID   Name   ExemptionStatus   TotalValue
   1      X          2              100
   2      X          3              200
   3      X          2             1000
   4      X          3             2000
   5      X          2             1045
   6      X          3             2045
   7      X          2             1034
   8      X          3             2023
   9      X          2             1023
  10      X          3             2076
因此,您的数据如下所示:

CREATE TABLE tab(ID int, Name nvarchar(20), ExemptionStatus int, TotalValue int);
INSERT INTO tab(ID, Name, ExemptionStatus, TotalValue) values (1, 'X', 2, 100);
INSERT INTO tab(ID, Name, ExemptionStatus, TotalValue) values (2, 'X', 3, 200);
   ID   Name   ExemptionStatus   TotalValue
    1     X        2                100
    2     X        3                200
   ID   Name   ExemptionStatus   TotalValue
   1      X          2              100
   2      X          3              200
   3      X          2             1000
   4      X          3             2000
   5      X          2             1045
   6      X          3             2045
   7      X          2             1034
   8      X          3             2023
   9      X          2             1023
  10      X          3             2076
那么您将使用的查询是:

SELECT      NotExempted.Name,
            NotExempted.NonExemptValue,
            Exempted.ExemptValue
FROM        (SELECT     Name,
                        CASE 
                            WHEN ExemptionStatus = 2 THEN TotalValue
                        END
                        AS 'NonExemptValue'
             FROM       #tab
            ) NotExempted
INNER JOIN  (SELECT     Name,
                        CASE 
                            WHEN ExemptionStatus = 3 THEN TotalValue
                        END
                        AS 'ExemptValue'
             FROM       #tab
            ) Exempted ON NotExempted.Name = Exempted.Name
WHERE        NotExempted.NonExemptValue IS NOT NULL
AND          Exempted.ExemptValue IS NOT NULL
GROUP BY     NotExempted.Name,
             NotExempted.NonExemptValue,
             Exempted.ExemptValue
您的结果将如下所示:

Name  NonExemptValue    ExemptValue
 X         100             200
CREATE TABLE #tab(ID int, Name nvarchar(20), ExemptionStatus int, TotalValue int)
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (1, 'X', 2, 100)
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (2, 'X', 3, 200)
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (3, 'X', 2, 1000)
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (4, 'X', 3, 2000)
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (5, 'X', 2, 1045)
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (6, 'X', 3, 2045)
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (7, 'X', 2, 1034)
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (8, 'X', 3, 2023)
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (9, 'X', 2, 1023)
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (10, 'X', 3, 2076)
Name  NonExemptValue    ExemptValue
 X         4202             8344
你可以在这里看到->

现在,假设您有如下数据:

Name  NonExemptValue    ExemptValue
 X         100             200
CREATE TABLE #tab(ID int, Name nvarchar(20), ExemptionStatus int, TotalValue int)
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (1, 'X', 2, 100)
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (2, 'X', 3, 200)
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (3, 'X', 2, 1000)
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (4, 'X', 3, 2000)
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (5, 'X', 2, 1045)
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (6, 'X', 3, 2045)
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (7, 'X', 2, 1034)
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (8, 'X', 3, 2023)
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (9, 'X', 2, 1023)
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (10, 'X', 3, 2076)
Name  NonExemptValue    ExemptValue
 X         4202             8344
看起来是这样的:

CREATE TABLE tab(ID int, Name nvarchar(20), ExemptionStatus int, TotalValue int);
INSERT INTO tab(ID, Name, ExemptionStatus, TotalValue) values (1, 'X', 2, 100);
INSERT INTO tab(ID, Name, ExemptionStatus, TotalValue) values (2, 'X', 3, 200);
   ID   Name   ExemptionStatus   TotalValue
    1     X        2                100
    2     X        3                200
   ID   Name   ExemptionStatus   TotalValue
   1      X          2              100
   2      X          3              200
   3      X          2             1000
   4      X          3             2000
   5      X          2             1045
   6      X          3             2045
   7      X          2             1034
   8      X          3             2023
   9      X          2             1023
  10      X          3             2076
如果需要将总值相加,则可以使用以下查询,这是对上述查询的轻微修改:

SELECT      NotExempted.Name,
            NotExempted.NonExemptValue,
            Exempted.ExemptValue
FROM        (SELECT     Name,
                        CASE 
                            WHEN ExemptionStatus = 2 THEN (SELECT SUM(TotalValue) FROM #tab WHERE ExemptionStatus = 2)
                        END
                        AS 'NonExemptValue'
             FROM       #tab
            ) NotExempted
INNER JOIN  (SELECT     Name,
                        CASE 
                            WHEN ExemptionStatus = 3 THEN (SELECT SUM(TotalValue) FROM #tab WHERE ExemptionStatus = 3)
                        END
                        AS 'ExemptValue'
             FROM       #tab
            ) Exempted ON NotExempted.Name = Exempted.Name
WHERE        NotExempted.NonExemptValue IS NOT NULL
AND          Exempted.ExemptValue IS NOT NULL
GROUP BY     NotExempted.Name,
             NotExempted.NonExemptValue,
             Exempted.ExemptValue
您的结果将如下所示:

Name  NonExemptValue    ExemptValue
 X         100             200
CREATE TABLE #tab(ID int, Name nvarchar(20), ExemptionStatus int, TotalValue int)
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (1, 'X', 2, 100)
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (2, 'X', 3, 200)
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (3, 'X', 2, 1000)
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (4, 'X', 3, 2000)
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (5, 'X', 2, 1045)
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (6, 'X', 3, 2045)
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (7, 'X', 2, 1034)
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (8, 'X', 3, 2023)
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (9, 'X', 2, 1023)
INSERT INTO #tab(ID, Name, ExemptionStatus, TotalValue) values (10, 'X', 3, 2076)
Name  NonExemptValue    ExemptValue
 X         4202             8344
你可以在这里看到->


希望这有帮助

你为什么不用枢轴呢?谢谢你,这很有效。但它确实将零放在了列中应该存在的值的位置上,所以我只需要看看像where这样的东西是否可以免除像“0”之类的值。但至少这让我走上了正确的轨道。嗯,那不应该用0来代替任何东西……你到底是什么意思?很抱歉,我是个新手,我没有注意到它。在本例中,如果状态为ELSE 0,则会显示0值。我只是想弄清楚如何将新列对齐,这样它们就可以像我的示例中那样排列起来了?对我来说,也许我可以澄清一下,以确保我们在同一页上。它将创建新列,但不会删除该行,而不是为X创建一行并同时拥有两个新列。因此,我将这些值放在单独的列中,但有些行没有被删除。新的分隔值应该在哪里,有一个0,如果我删除ELSE子句,它是空的。我想我明白你的意思了…编辑我对COME的回答我让它工作了,但现在我想学习的是如何添加从案例中创建的两列。我要试着弄清楚,如果没有,我会把它作为一个新问题发布,因为这是正确的礼仪。事实上,我得到了我需要的,其他两个值的总和最初是在我不选择案例时完成的,我得到了。@d_li1121我添加了一个小提琴,以更清楚地显示结果集。您可以看到只返回了一行。@d_li1121我编辑了我的答案,告诉您如何获得总值列的总和。