Sql 如果与另一列中的列和值匹配,则获取列和值
我有这样一个问题:Sql 如果与另一列中的列和值匹配,则获取列和值,sql,subquery,Sql,Subquery,我有这样一个问题: ( SELECT DISTINCT UniqueBatchNumber AS UBN, count(ID) AS Count, SUM(amount) AS Total, InstrumentType AS IType FROM Transactions WHERE TransactionDate = '2012-10-01' GROUP BY UniqueBatchNumber, InstrumentType HAVING InstrumentTyp
(
SELECT DISTINCT UniqueBatchNumber AS UBN,
count(ID) AS Count,
SUM(amount) AS Total,
InstrumentType AS IType
FROM Transactions
WHERE TransactionDate = '2012-10-01'
GROUP BY UniqueBatchNumber, InstrumentType HAVING InstrumentType = 'c'
)
UNION ALL
(
SELECT DISTINCT
UniqueBatchNumber AS UBN,
count(ID) AS Count,
SUM(amount) AS Total,
InstrumentType AS IType
FROM Transactions
WHERE TransactionDate = '2012-10-01'
GROUP BY UniqueBatchNumber, InstrumentType HAVING InstrumentType = 'd'
)
它返回以下内容:
UBN | Count | Total | IType
8237 | 1 | 150689.43 | C
8238 | 26 | 42838.80 | C
8241 | 1 | 2410932.00 | C
8247 | 1 | 100.00 | C
8250 | 1 | 99297.05 | C
8256 | 1 | 1929.00 | C
8259 | 16 | 12623.86 | C
8269 | 1 | 7405022.45 | C
8238 | 1 | 346522.57 | D
8241 | 1 | 303.00 | D
8243 | 1 | 204066.05 | D
8246 | 1 | 100.00 | D
8247 | 1 | 99297.05 | D
8256 | 11 | 847.00 | D
8259 | 1 | 571888.90 | D
8279 | 5 | 3986.75 | D
但就是还不能解决这个问题,有什么想法吗
提前谢谢你。沿着这些思路,你会接近你想要的东西吗
SELECT
C.ubn AS ubn_C,
D.ubn AS ubn_D,
C.count AS Count_C,
D.count AS Count_D,
C.total AS MatchingTotal
FROM
(SELECT DISTINCT
uniquebatchnumber AS ubn,
Count(id) AS count,
Sum(amount) AS total,
Instrumenttype AS itype
FROM
transactions
WHERE
transactiondate = '2012-10-01'
AND instrumenttype = 'c'
GROUP BY
uniquebatchnumber,
instrumenttype) AS C
JOIN
(SELECT DISTINCT
uniquebatchnumber AS ubn,
Count(id) AS count,
Sum(amount) AS total,
Instrumenttype AS itype
FROM
transactions
WHERE
transactiondate = '2012-10-01'
AND instrumenttype = 'd'
GROUP BY
uniquebatchnumber,
instrumenttype) AS D
ON C.Total = D.Total
请尝试此查询。
您已经完成了90%的工作,只需在查询中稍作更改
SELECT
A.UBN,
SUM(ISNULL(A.Total,0)) Total
FROM
(
SELECT
DISTINCT
UniqueBatchNumber AS UBN,
count(ID) AS Count,
SUM(amount) AS Total,
InstrumentType AS IType
FROM
Transactions
WHERE
TransactionDate = '2012-10-01'
GROUP BY
UniqueBatchNumber,
InstrumentType
HAVING
InstrumentType = 'c'
UNION
SELECT
DISTINCT
UniqueBatchNumber AS UBN,
count(ID) AS Count,
SUM(amount) AS Total,
InstrumentType AS IType
FROM
Transactions
WHERE
TransactionDate = '2012-10-01'
GROUP BY
UniqueBatchNumber,
InstrumentType
HAVING InstrumentType = 'd'
)
AS A
GROUP BY
A.UBN
我建议您使用UNION而不是UNION ALL Bcoz UNION在性能方面比UNION ALL快一点
此查询未经测试。
如果此查询出现任何错误,请回复。因此,您只需要多个条目具有相同UBN但不同IType的条目?欢迎使用So!你能举一个预期产出的例子吗?从您的描述中,我不清楚。听起来您希望在
c
中设置一组UBN,在d
中设置一组UBN的交集?您使用的是哪种DBMS?博士后?神谕(顺便说一句:在一个联合体中,围绕个人选择的括号是无用的)我正在使用SQL Server 2012。@如果此查询不适合您,请回答我非常感谢您的回答…测试了它,看起来与我想要的非常接近…是否可能也包含不匹配的项,或者我必须使用另一个查询。您想要哪些不匹配的项(特别是要添加的列)从这两列中…我将使用一个大数据集进行进一步测试。如果需要,我将提供反馈。谢谢。不,不需要为输出编写另一个查询。这取决于您想要什么类型的输出。1.您也想要计数的总和吗?2.假设总和=3,那么您想要具有相同输出的两行吗?请发布预期的输出你想要的。谢谢你,乔。这差不多了。如果我能做一些像…关于和(C.Total)=和(D.Total)。我怎么能得到不匹配的批号(UBN)。非常感谢。你好。我不知道你为什么要做关于和(C.Total)=和(D.Total)的事情。所写的查询已经与每个批号的金额总和相匹配(它们在派生表查询中求和)。或者我不理解您的要求吗?谢谢Joe…我意识到这是不可行的,甚至是不必要的,因为UBN部分不同。非常感谢您的回答。
SELECT
A.UBN,
SUM(ISNULL(A.Total,0)) Total
FROM
(
SELECT
DISTINCT
UniqueBatchNumber AS UBN,
count(ID) AS Count,
SUM(amount) AS Total,
InstrumentType AS IType
FROM
Transactions
WHERE
TransactionDate = '2012-10-01'
GROUP BY
UniqueBatchNumber,
InstrumentType
HAVING
InstrumentType = 'c'
UNION
SELECT
DISTINCT
UniqueBatchNumber AS UBN,
count(ID) AS Count,
SUM(amount) AS Total,
InstrumentType AS IType
FROM
Transactions
WHERE
TransactionDate = '2012-10-01'
GROUP BY
UniqueBatchNumber,
InstrumentType
HAVING InstrumentType = 'd'
)
AS A
GROUP BY
A.UBN