【问题标题】:SQL - Creating Additional Lines of zero value data (Cross Join type?)SQL - 创建额外的零值数据行(交叉连接类型?)
【发布时间】:2014-10-23 02:49:50
【问题描述】:

我试图弄清楚如何让查询工作。我有点想做交叉连接,但不是真正的交叉连接类型查询..也不是完全连接(我不认为)所以我将它扔给社区以供输入。

我有表 1:

Acct  AcctDesc   CostType   Value1  Value2
12    School     Tax        12.42   3.20
12    School     Supplies   34.22   9.88
12    School     Payroll    122.00  8.88
12    School     Milk       8.88    7.77
13    Work       Tax        28.88   9.70
13    Work       Supplies   15.15   8.80
13    Work       Cookies    5.90    7.00
13    Work       Payroll    79.00   8.88
13    Work       Misc       4.33    3.33
13    Work       Vehicle    8.33    0.33

有了这张表,我有多个 CostType。我想获取所有独特的成本类型并将它们加入数据以创建一个视图,该视图将产生(在本例中为学校)并将成本输入为零。 (用于稍后在报表上返回零列)

Acct  AcctDesc   CostType   Value1  Value2
12    School     Tax        12.42   3.20
12    School     Supplies   34.22   9.88
12    School     Payroll    122.00  8.88
12    School     Milk       8.88    7.77
12    School     Cookies    0.00    0.00
12    School     Misc       0.00    0.00
12    School     Vehicle    0.00    0.00

我以为我可以做类似的事情

Select Acct, AcctDesc, CostType, Value1, Value2 
from Table1
Cross Join (Select Distinct CostType from Table1) t2

但我很快意识到它不会像那样工作。我也尝试过自然连接,但这也行不通。

我想我可能需要对表中的所有唯一值进行 CTE,然后对原始查询进行左连接,我认为这是最不理想的,所以我想把它扔给你们.

感谢您的意见。

【问题讨论】:

  • 将类型存储在单独的表中并在数据表中引用它们?

标签: sql-server join cross-join unique-values


【解决方案1】:

这应该可行(尽管可能有更好的方法):

SELECT 
    subq.Acct, 
    subq.AcctDesc, 
    subq.CostType, 
    Value1 = ISNULL(Value1,0), 
    Value2 = ISNULL(Value2,0) 
FROM (
    SELECT
       t1.CostType, 
       t2.Acct, 
       t2.AcctDesc 
    FROM Table1 t1 
    CROSS JOIN Table1 t2
    GROUP BY t1.CostType, t2.Acct, t2.AcctDesc
    ) subq
LEFT JOIN Table1 t ON subq.CostType = t.CostType 
                  AND subq.Acct = t.Acct
                  AND subq.AcctDesc = t.AcctDesc
--WHERE t.AcctDesc = 'School'
ORDER BY subq.Acct, subq.AcctDesc

样本输出:

Acct    AcctDesc         CostType         Value1             Value2
------- ---------------- ---------------- ------------------ ------------------
12      School           Cookies          0                  0
12      School           Milk             8,88               7,77
12      School           Misc             0                  0
12      School           Payroll          122                8,88
12      School           Supplies         34,22              9,88
12      School           Tax              12,42              3,2
12      School           Vehicle          0                  0
13      Work             Cookies          5,9                7
13      Work             Milk             0                  0
13      Work             Misc             4,33               3,33
13      Work             Payroll          79                 8,88
13      Work             Supplies         15,15              8,8
13      Work             Tax              28,88              9,7
13      Work             Vehicle          8,33               0,33

【讨论】:

  • 我试图将您的逻辑应用于具有更多成本类型、AcctDescs 等的数据集。它会以指数方式变大……重复更多。我认为这行不通。我真正需要的是遵循以下场景的东西“这里是每个帐户应该拥有的项目的定义列表。源表只显示不为空的值。”答案应该是“这就是我们显示所有帐户和项目的方式,其中空项目行显示为“零”。
  • @Dregalia 好的,我稍后再看看。
  • 我一直在摆弄它.. 你就在那里,但我做了一些调整,它似乎按预期工作。
  • @Dregalia 啊,我明白了,我认为 Acct 和 AcctDesc 是相关的,所以我没有包括最后一个加入。现已更新。
  • 感谢您帮助我完成它。我知道我必须靠近。我真的很感激。
【解决方案2】:

这里似乎可以正常工作

SELECT 
    subq.Acct, 
    subq.AcctDesc, 
    subq.CostType, 
    Value1 = ISNULL(Value1,0), 
    Value2 = ISNULL(Value2,0) 
FROM (
    SELECT
       t2.CostType, 
       t1.Acct, 
       t1.AcctDesc 
    FROM Table1 t1 
    CROSS JOIN (select distinct CostType from Table1) t2
    GROUP BY t2.CostType, t1.Acct, t1.AcctDesc
    ) subq
LEFT JOIN Table1 t ON subq.CostType = t.CostType 
                  AND subq.Acct = t.Acct
                  and subq.AcctDesc = t.AcctDesc
--WHERE t.AcctDesc = 'School'
ORDER BY subq.Acct, subq.AcctDesc

【讨论】:

    猜你喜欢
    • 2022-10-14
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 2019-03-03
    • 1970-01-01
    相关资源
    最近更新 更多