Sql server 在SQL Server中切换行和列以生成摘要报告

Sql server 在SQL Server中切换行和列以生成摘要报告,sql-server,pivot,Sql Server,Pivot,我有一个查询,geneartes数据的格式也显示: SELECT TOP (10) { FN CONCAT({ FN CONCAT(dbo.BILL_INFO.BILL_NUMBER, '-')}, REPLICATE('0', 2 - LEN(RTRIM(dbo.BILL_INFO.PAY_MODE_ID))) + RTRIM(dbo.BILL_INF

我有一个查询,geneartes数据的格式也显示:

SELECT TOP (10)
       { FN CONCAT({ FN CONCAT(dbo.BILL_INFO.BILL_NUMBER, '-')}, REPLICATE('0', 2 - LEN(RTRIM(dbo.BILL_INFO.PAY_MODE_ID)))
                                                                 + RTRIM(dbo.BILL_INFO.PAY_MODE_ID))} AS Id,
       dbo.BILL_INFO.PAY_MODE_ID,
       dbo.MASTER_PAY_MODE.NAME AS PAY_MODE
FROM dbo.BILL_INFO
    INNER JOIN dbo.MASTER_PAY_MODE
        ON dbo.BILL_INFO.PAY_MODE_ID = dbo.MASTER_PAY_MODE.ID
ORDER BY dbo.BILL_INFO.BILL_DATE DESC;

我需要将结果转换为以下格式:

我可以使用excel和pivot来实现这一点,但有没有办法使用SQL查询

样本数据

Id                |BILL_DATE              |PAY_MODE
0000056-1002-18-10|2018-11-26 14:03:03.553|Bank Transfer
0001199-1002-18-05|2018-11-26 13:58:25.763|Credit Card
0000162-1030-18-05|2018-11-26 13:55:40.590|Credit Card
0001198-1002-18-05|2018-11-26 13:49:39.013|Credit Card
0001859-1030-18-04|2018-11-26 13:44:23.333|Free
0004443-1002-18-03|2018-11-26 13:42:27.550|Debit
0001532-1031-18-03|2018-11-26 13:36:23.010|Debit
0001916-1002-18-04|2018-11-26 13:33:23.157|Free
0001915-1002-18-04|2018-11-26 13:32:45.653|Free
0001914-1002-18-04|2018-11-26 13:30:35.580|Free
0004442-1002-18-03|2018-11-26 13:24:11.730|Debit
0004441-1002-18-03|2018-11-26 13:22:35.020|Debit
0004440-1002-18-03|2018-11-26 13:12:01.920|Debit
0004439-1002-18-03|2018-11-26 13:10:06.483|Debit
0001197-1002-18-05|2018-11-26 13:07:19.673|Credit Card
0001196-1002-18-05|2018-11-26 13:02:31.527|Credit Card
0004438-1002-18-03|2018-11-26 13:00:01.000|Debit
0001003-1030-18-03|2018-11-26 12:57:42.630|Debit
0001531-1031-18-03|2018-11-26 12:56:33.210|Debit
0001913-1002-18-04|2018-11-26 12:54:41.077|Free
更新 我采取了[蒂姆·比格莱森]提供的解决方案如下:

SELECT
     MONTH(bi.BILL_DATE) AS [Month],
    MAX(CASE WHEN m.NAME = 'Cheque' THEN bi.PAY_MODE_ID END) AS Cheque,
    MAX(CASE WHEN m.NAME = 'Cash'   THEN bi.PAY_MODE_ID END) AS Cash,
    MAX(CASE WHEN m.NAME = 'Bank Transfer' THEN bi.PAY_MODE_ID END) AS [Bank Transfer],
    MAX(CASE WHEN m.NAME = 'Credit Card' THEN bi.PAY_MODE_ID END) AS [Credit Card],
    MAX(CASE WHEN m.NAME = 'Debit' THEN bi.PAY_MODE_ID END) AS Debit,
    MAX(CASE WHEN m.NAME = 'Free' THEN bi.PAY_MODE_ID END) AS Free
FROM dbo.BILL_INFO bi
INNER JOIN dbo.MASTER_PAY_MODE m
    ON bi.PAY_MODE_ID = m.ID
    WHERE YEAR(bi.BILL_DATE) = 2018
GROUP BY
     MONTH(bi.BILL_DATE) ORDER BY  MONTH(bi.BILL_DATE)

您可以通过pivot查询执行此操作,可能仅通过以下几行:

SELECT
    YEAR(bi.BILL_DATE) + '-' + MONTH(bi.BILL_DATE) AS Date,
    COUNT(CASE WHEN m.NAME = 'Cheque' THEN 1 END) AS Cheque,
    COUNT(CASE WHEN m.NAME = 'Cash'   THEN 1 END) AS Cash,
    COUNT(CASE WHEN m.NAME = 'Bank Transfer' THEN 1 END) AS [Bank Transfer],
    COUNT(CASE WHEN m.NAME = 'Credit Card' THEN 1 END) AS [Credit Card],
    COUNT(CASE WHEN m.NAME = 'Debit' THEN 1 END) AS Debit,
    COUNT(CASE WHEN m.NAME = 'Free' THEN 1 END) AS Free
FROM dbo.BILL_INFO bi
INNER JOIN dbo.MASTER_PAY_MODE m
    ON bi.PAY_MODE_ID = m.ID
GROUP BY
    YEAR(bi.BILL_DATE) + '-' + MONTH(bi.BILL_DATE);

请注意,我是按月份和年份对日期列进行分组的,因为通常,
BILL\u INFO
表中显示的给定月份可能属于多个年份。

您可以通过透视查询来执行此操作,可能只有以下几行:

SELECT
    YEAR(bi.BILL_DATE) + '-' + MONTH(bi.BILL_DATE) AS Date,
    COUNT(CASE WHEN m.NAME = 'Cheque' THEN 1 END) AS Cheque,
    COUNT(CASE WHEN m.NAME = 'Cash'   THEN 1 END) AS Cash,
    COUNT(CASE WHEN m.NAME = 'Bank Transfer' THEN 1 END) AS [Bank Transfer],
    COUNT(CASE WHEN m.NAME = 'Credit Card' THEN 1 END) AS [Credit Card],
    COUNT(CASE WHEN m.NAME = 'Debit' THEN 1 END) AS Debit,
    COUNT(CASE WHEN m.NAME = 'Free' THEN 1 END) AS Free
FROM dbo.BILL_INFO bi
INNER JOIN dbo.MASTER_PAY_MODE m
    ON bi.PAY_MODE_ID = m.ID
GROUP BY
    YEAR(bi.BILL_DATE) + '-' + MONTH(bi.BILL_DATE);

请注意,我是按月份和年份对日期列进行分组的,因为通常,
BILL\u INFO
表中显示的给定月份可能属于一年以上。

我用图像更新了答案。正在产生的结果并不像预期的那样。我已将年份固定为2018年,并且仅按月份分组,因为原始查询没有正确打印日期列。SUM而不是MAX?我达到了COUNT,正如您也进行了编辑一样。问题已解决。我已使用图像更新了我的答案。正在产生的结果并不像预期的那样。我已将年份固定为2018年,并且仅按月份分组,因为原始查询没有正确打印日期列。SUM而不是MAX?我达到了COUNT,正如您也进行了编辑一样。问题已解决。请为这两个表提供样本数据。@TimBiegeleisen,我已经放置了一个样本数据提取,我想转换它。数据没有多大意义。行是日期/月份,列是支付模式,但值是什么?哪列给出了值?对不起。我想计算每个月使用每个付款模式的次数检查我的更新答案。下次你在这里发帖时,不要包括图片。只需将样本数据和预期输出显示为文本。请为两个表提供样本数据。@TimBiegeleisen,我已经放置了一个样本数据提取,我想转置。数据没有多大意义。行是日期/月份,列是支付模式,但值是什么?哪列给出了值?对不起。我想计算每个月使用每个付款模式的次数检查我的更新答案。下次你在这里发帖时,不要包括图片。只需以文本形式显示示例数据和预期输出。